class Solution {
public:
bool isCovered(vector<vector<int>>& ranges, int left, int right) {
vector<int> diff(60);
for(auto& p:ranges) {
diff[p[0]]++;
diff[p[1]+1]--;
}
int s = 0;
for(int i = 1; i <= 50; i++) {
s += diff[i];
if(left <= i && i <= right && s == 0) return false;
}
return true;
}
};
class Solution {
public boolean isCovered(int[][] ranges, int left, int right) {
Arrays.sort(ranges, (o1, o2) -> {
if (o1[0] < o2[0]) return -1;
else if (o1[0] > o2[0]) return 1;
else return o1[1] - o2[1];
});
TreeMap<Integer, Integer> map = new TreeMap<>();
int l = ranges[0][0], r = ranges[0][1];
for (int[] p : ranges) {
int x = p[0], y = p[1];
if (x <= r + 1) {
r = Math.max(r, y);
} else {
map.put(l, r);
l = x;
r = y;
}
}
map.put(l, r);
Map.Entry<Integer, Integer> entry = map.floorEntry(left);
return entry != null && entry.getValue() >= right;
}
}
异曲同工之妙的做法。
class Solution {
public boolean isCovered(int[][] ranges, int left, int right) {
// 思路1 : 排序 时间n*logn
Arrays.sort(ranges, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
if(o1[0] == o2[0]) return o1[1] - o2[1];
else return o1[0] - o2[0];
}
});
for(int[] r : ranges) {
if(left > right) return true;
if(r[0] <= left && left <= r[1]) left = r[1] + 1;
}
return left > right;
}
}