【数据结构-一维差分】力扣1893. 检查是否区域内所有整数都被覆盖

给你一个二维整数数组 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

差分

cpp 复制代码
class Solution {
public:
    bool isCovered(vector<vector<int>>& ranges, int left, int right) {
        int max_end = INT_MIN;
        int min_start = INT_MAX;
        for (auto& range : ranges) {
            min_start = min(min_start, range[0]);
            max_end = max(max_end, range[1]);
        }
        min_start = min(min_start, left);
        max_end = max(max_end, right);
        
        vector<int> diff(max_end+2);
        for(auto& row : ranges){
            diff[row[0]]++;
            diff[row[1]+1]--;
        }

        int s = 0;
        for(int i = min_start; i <= right; i++){
            s += diff[i];
            if(i >= left && s <=0){
                return false;
            }
        }
        return true;
    }
};

这道题和2848相似,如果使用差分的方法做这道题,需要理解的是for(int i = min_start; i <= max_end; i++)为什么是从min_start到max_end。首先因为是差分的办法,所以i开始必须在ranges中最小的range[0]及其左边开始,但是由于可能会出现left在最小range[0]的左边,从而在遍历left到最小range[0]的时候满足了i>left而且s这时候又为0,会返回false。为了确保包含这种情况,我们取min_start为最小range[0]和left的较小值。我们定义max_end的作用就是确保row[1]+1和right都能在diff里不越界。当i到right的时候进行最后一次循环,因为我们的目的是找出left到right范围内的值是否有覆盖,所以遍历right以后的范围没有意义。总而言之我们需要遍历left到right的diff,但是又因为差分要保证从最小的range[0]即左边开始,所以在左边界取min(min_start, range[0])

相关推荐
田梓燊8 分钟前
2026/4/11 leetcode 3741
数据结构·算法·leetcode
斯内科17 分钟前
FFT快速傅里叶变换
算法·fft
葳_人生_蕤24 分钟前
hot100——栈和队列
数据结构
2301_8227032026 分钟前
开源鸿蒙跨平台Flutter开发:幼儿疫苗全生命周期追踪系统:基于 Flutter 的免疫接种档案与状态机设计
算法·flutter·华为·开源·harmonyos·鸿蒙
贵慜_Derek28 分钟前
Managed Agents 里,Harness 到底升级了什么?
人工智能·算法·架构
2301_822703201 小时前
鸿蒙flutter三方库实战——教育与学习平台:Flutter Markdown
学习·算法·flutter·华为·harmonyos·鸿蒙
Jia ming1 小时前
C语言实现日期天数计算
c语言·开发语言·算法
无限进步_2 小时前
【C++&string】大数相乘算法详解:从字符串加法到乘法实现
java·开发语言·c++·git·算法·github·visual studio
苏纪云2 小时前
蓝桥杯考前突击
c++·算法·蓝桥杯
W23035765732 小时前
经典算法详解:最长公共子序列 (LCS) —— 从暴力递归到动态规划完整实现
算法·动态规划·最长子序列