Easy
题目描述
给你一个二维整数数组 ranges 和两个整数 left 和 right。每个 ranges[i] = [starti, endi] 表示一个从 starti 到 endi 的 闭区间。
如果闭区间 [left, right] 内的每个整数都被 ranges 中 至少一个 区间覆盖,那么请你返回 true ,否则返回 false 。
已知区间 ranges[i] = [starti, endi] ,如果整数 x 满足 starti <= x <= endi ,那么我们称整数 x 被覆盖了。
示例 1:
输入:ranges = [[1,2],[3,4],[5,6]], left = 2, right = 5
输出:true
解释:2 到 5 的每个整数都被覆盖了:
- 2 被第一个区间覆盖。
- 3 和 4 被第二个区间覆盖。
- 5 被第三个区间覆盖。
示例 2:
输入:ranges = [[1,10],[10,20]], left = 21, right = 21
输出:false
解释:21 没有被任何一个区间覆盖。
提示:
1 <= ranges.length <= 501 <= starti <= endi <= 501 <= left <= right <= 50
解题思路
这道题要求检查区间 [left, right] 内的每个整数是否都被给定的区间数组覆盖。我们可以从几个角度来解决:
方法一:暴力枚举(推荐)
由于约束条件较小(所有值都不超过50),可以直接枚举区间 [left, right] 中的每个整数,检查是否存在至少一个区间能够覆盖它。时间复杂度为 O(n×m),其中 n 是目标区间长度,m 是区间数组长度。
方法二:布尔数组标记 创建一个布尔数组来标记哪些位置被覆盖,遍历所有区间并标记覆盖范围,最后检查目标区间是否完全被标记。
方法三:差分数组 使用差分数组的思想,对每个区间进行标记,然后通过前缀和还原实际的覆盖情况。
考虑到题目的数据规模很小,暴力枚举是最直观且高效的解法。对于每个需要检查的整数,我们遍历所有区间,如果找到一个区间能覆盖它,就继续检查下一个整数;如果某个整数没有被任何区间覆盖,直接返回 false。
代码实现
class Solution {
public:
bool isCovered(vector<vector<int>>& ranges, int left, int right) {
for (int i = left; i <= right; i++) {
bool covered = false;
for (auto& range : ranges) {
if (range[0] <= i && i <= range[1]) {
covered = true;
break;
}
}
if (!covered) return false;
}
return true;
}
};
class Solution:
def isCovered(self, ranges: List[List[int]], left: int, right: int) -> bool:
for i in range(left, right + 1):
covered = False
for start, end in ranges:
if start <= i <= end:
covered = True
break
if not covered:
return False
return True
public class Solution {
public bool IsCovered(int[][] ranges, int left, int right) {
for (int i = left; i <= right; i++) {
bool covered = false;
foreach (int[] range in ranges) {
if (range[0] <= i && i <= range[1]) {
covered = true;
break;
}
}
if (!covered) return false;
}
return true;
}
}
var isCovered = function(ranges, left, right) {
for (let i = left; i <= right; i++) {
let covered = false;
for (let range of ranges) {
if (range[0] <= i && i <= range[1]) {
covered = true;
break;
}
}
if (!covered) return false;
}
return true;
};
复杂度分析
| 复杂度类型 | 复杂度 |
|---|---|
| 时间复杂度 | O(n × m),其中 n = right - left + 1,m = ranges.length |
| 空间复杂度 | O(1) |
相关题目
- . Find Maximal Uncovered Ranges (Medium)