LeetCode 1893 检查是否区域内所有整数都被覆盖[前缀和 暴力 差分数组] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1893 检查是否区域内所有整数都被覆盖[前缀和 暴力 差分数组] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
由于本题中所给的范围只有50,那么暴力把所有的left到right的数全部在范围数据中遍历一遍,如果没有直接返回false,都有返回true,代码如下:
class Solution {
public:
bool isCovered(vector<vector<int>>& ranges, int left, int right) {
bool flag;
for(int i = left; i <= right; i ++) {
flag = false;
for(auto& range : ranges) {
if(range[0] <= i && range[1] >= i) {
flag =true;
break;
}
}
if(!flag) {
return false;
}
}
return flag == true;
}
};
但是不得不说这种方法有些笨拙,时间复杂度怎么说也是O(2n*m),并不是特别好的结果,采用差分数组和前缀和的方式,可以在O(n + m)的时间复杂度里解决问题,差分数组diff维护相邻两个整数的被覆盖区间数量变化量,如果遍历到区间[l, r],那么l - 1比 l少一个区间,r + 1比r少一个区间,所以遇到不在范围内的数的状况是前缀和为0或者小于0,代码如下:
class Solution {
public:
bool isCovered(vector<vector<int>>& ranges, int left, int right) {
int diff[52] = {0}; // 差分数组
for (auto&& range: ranges){
++diff[range[0]];
--diff[range[1]+1];
}
// 前缀和
int curr = 0;
for (int i = 1; i <= 50; ++i){
curr += diff[i];
if (i >= left && i <= right && curr <= 0){
return false;
}
}
return true;
}
};
以上是关于LeetCode 1893 检查是否区域内所有整数都被覆盖[前缀和 暴力 差分数组] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
[E差分] lc1893. 检查是否区域内所有整数都被覆盖(差分计数+模拟+双周赛54_1)