题目链接:
力扣https://leetcode-cn.com/problems/check-if-all-the-integers-in-a-range-are-covered/
【分析-暴力】这道题的数据只有50,所以可以建一个长度为50的数组标记是否被前面的ranges覆盖,然后遍历left和right之间的位置,看是否被标记。
class Solution {
public boolean isCovered(int[][] ranges, int left, int right) {
int[] arrs = new int[51];
int n = ranges.length;
int i, j, l, r;
for(i = 0; i < n; i++){
l = ranges[i][0]; r = ranges[i][1];
for(j = l; j <= r; j++) arrs[j] = 1;
}
for(i = left; i <= right; i++){
if(arrs[i] != 1) return false;
}
return true;
}
}
【优化-差分数组】可以用差分+前缀和的思想,防止每个range都遍历一遍
class Solution {
public boolean isCovered(int[][] ranges, int left, int right) {
int n = ranges.length;
int[] arrs = new int[52];
int i, l, r;
for(i = 0; i < n; i++){
l = ranges[i][0]; r = ranges[i][1];
arrs[l] += 1; arrs[r + 1] -= 1;
}
for(i = 1; i <= 50; i++){
arrs[i] += arrs[i - 1];
}
for(i = left; i <= right; i++){
if(arrs[i] == 0) return false;
}
return true;
}
}
【树状数组】既然这里有差分数组了,那用树状数组也能实现差分那样的效果。试一下差分树状数组,也就是区间插入+单点查询的树状数组。
class Solution {
int[] tree = new int[52];
int lowbit(int x){
return x & -x;
}
void add(int x, int val){
for(; x <= 51; x += lowbit(x)) tree[x] += val;
}
int ask(int x){
int ans = 0;
for(; x > 0; x -= lowbit(x)) ans += tree[x];
return ans;
}
public boolean isCovered(int[][] ranges, int left, int right) {
int n = ranges.length;
int i, j, l, r;
for(i = 0; i < n; i++){
l = ranges[i][0]; r = ranges[i][1];
add(l, 1);
add(r + 1, -1);
}
for(i = left; i <= right; i++){
if(ask(i) == 0) return false;
}
return true;
}
}