Easy

题目描述

给你一个二维整数数组 ranges 和两个整数 leftright。每个 ranges[i] = [starti, endi] 表示一个从 startiendi闭区间

如果闭区间 [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 <= 50
  • 1 <= starti <= endi <= 50
  • 1 <= 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)

相关题目