检查是否区域内所有整数都被覆盖

标签: 数组 哈希表 前缀和

难度: 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 <= 50
  • 1 <= starti <= endi <= 50
  • 1 <= left <= right <= 50

Submission

运行时间: 24 ms

内存: 16.0 MB

class Solution:
    def isCovered(self, ranges: List[List[int]], left: int, right: int) -> bool:
        tmp = [0] * 51
        for item in ranges:
            for i in range(item[0],item[1]+1):
                    tmp[i] = 1
        for i in range(left, right+1):

            if tmp[i] == 0:
                return False
        return True
                

Explain

该题解采用了标记数组的方法来解决问题。首先,创建一个长度为51的数组tmp(考虑到题目中的整数范围可能从1到50),用于记录特定整数是否被覆盖。对于每个区间[starti, endi],遍历该区间中的所有整数,并将对应的tmp数组中的值设为1,表示该整数已被覆盖。接着,遍历从left到right的所有整数,检查这些整数是否都在tmp数组中被标记为1(即被覆盖)。如果存在未被覆盖的整数,则直接返回False。如果所有整数都被覆盖,则返回True。

时间复杂度: O(N+M)

空间复杂度: O(1)

class Solution:
    def isCovered(self, ranges: List[List[int]], left: int, right: int) -> bool:
        # 创建一个长度为51的数组来标记数字是否被覆盖
        tmp = [0] * 51
        # 遍历ranges中的每个区间
        for item in ranges:
            # 标记区间内的每个数字为已覆盖
            for i in range(item[0], item[1] + 1):
                tmp[i] = 1
        # 检查left到right的每个数字是否被覆盖
        for i in range(left, right + 1):
            if tmp[i] == 0:
                return False
        return True

Explore

在这个特定的问题中,我们需要频繁地检查和更新每个整数是否被覆盖的状态,数组通过其索引直接访问元素提供了O(1)的时间复杂度,这使得操作非常高效。而使用哈希表或集合虽然也可以达到类似的效果,但可能涉及更多的内存开销和计算开销(如哈希函数的计算)。考虑到整数范围有限(仅1到50),使用固定大小的数组是简单且高效的解决方案。

数组tmp的长度设为51是因为题目描述中提到整数的范围可能是1到50,因此为了简化索引操作(直接使用整数值作为索引而不需要额外的映射),数组的大小被固定为51(索引0不使用,1至50正好对应整数1到50的覆盖状态)。此外,这样的处理避免了基于left和right动态调整数组大小的复杂性,使得代码更为简洁和通用。

如果ranges包含的区间远大于[left, right],尽管这种方法在处理大范围区间时可能会导致对不必要的整数也进行覆盖检查,但由于数组tmp的大小固定为51,空间复杂度保持为O(1),即常数级别。因此,尽管可能存在一些不必要的覆盖检查,空间效率依然是高效的。对于这种情况,时间效率可能更受影响,因为需要遍历较大的区间来设置覆盖状态。