赞
踩
给你一个二维整数数组 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 没有被任何一个区间覆盖。
提示:
一:排序
class Solution {
public:
bool isCovered(vector<vector<int>>& ranges, int left, int right) {
sort(ranges.begin(), ranges.end());
for(auto &r : ranges){
if(left >= r[0] && left <= r[1]){
left = r[1] + 1;
}
}
return left > right;
}
};
二:差分数组 + 前缀和
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 sum = 0; //前缀和
for(int i=1; i<51; i++){
sum += diff[i];
//当sum <= 0时,表明当前位置没被覆盖
if(i >= left && i <= right && sum <= 0){
return false;
}
}
return true;
}
};
三:位运算
class Solution {
//位运算标记
public:
bool isCovered(vector<vector<int>>& ranges, int left, int right) {
long n = 1;
long L = n << left;
//+1是为了相减之后保证第 right 比特位为 1
long R = n << (right + 1);
long mark = R - L;
long res = 0;
for(auto &range : ranges){
L = n << range[0];
R = n << (range[1] + 1);
//或运算,只要被标记过,此位就为1
res |= (R - L);
}
res &= mark;
return res == mark;
}
};
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。