题目
给你一个二维整数数组 ranges 和两个整数 left 和 right 。每个 ranges[i] = [starti, endi] 表示一个从 starti 到 endi 的 闭区间 。
如果闭区间 [left, right] 内每个整数都被 ranges 中 至少一个 区间覆盖,那么请你返回 true ,否则返回 false 。
已知区间 ranges[i] = [starti, endi] ,如果整数 x 满足 starti <= x <= endi ,那么我们称整数x 被覆盖了。
思路:一开始思路其实比较简单,写个二重循环遍历一次就行了,主要是要判断返回false的条件,这个条件就是在left到right的任何一个数字中,都不包含在所有的range数组里面,用key来表示这个数字被多少个数组排除在外,每被排除一次就加1,直到等于数组的数量为止,因此代码实现为:
class Solution {
public boolean isCovered(int[][] ranges, int left, int right) {
// 思路 数组 最大为right,left
int i,j;
int key=0;
int length = ranges.length;
for (i=left;i<=right;i++){
for(j=0;j<length;j++){
if(i<ranges[j][0] || i>ranges[j][1]){
key++;
}
if(key==length) return false;
}
key = 0;
}
return true;
}
}
法2:先排序,再调整left的位置
区间的起始点从小到达排序,然后每次比较,如果拿到的区间[l,r],left在区间内,即 l <= left <= r,那么可知,[left,r]便已经被覆盖,接下来只需接续检查剩余空白部分,让left = r + 1, 如果最后left可以超过right,则区间全部被覆盖。为true。
class Solution {
public boolean isCovered(int[][] ranges, int left, int right) {
// 排序
Arrays.sort(ranges, (a1, a2) -> a1[0] - a2[0]);
for(int[] range: ranges) {
int l = range[0];
int r = range[1];
if(l <= left && left <= r) {
left = r + 1;
}
}
if(left>right){
return true;
}else return false;
}
}