持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情
一、题目描述:
给你一个二维整数数组 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 没有被任何一个区间覆盖。
提示:
1 <= ranges.length <= 50 1 <= starti <= endi <= 50 1 <= left <= right <= 50
来源:力扣(LeetCode) 链接:leetcode.cn/problems/ch… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
1.创建一个类表示每个区间,用list保存合并后的新区间组,将每个区间按照左端点排序; 2.把所有能合并在一起的区间用贪心的思想合并;把最后的结果集存在list中; 3.最后判断[left,right]是否在结果集的某个区间里
三、AC 代码:
class Solution {
public boolean isCovered(int[][] ranges, int left, int right) {
List<int[]> bigrange=new ArrayList<>();
int n=ranges.length;
for(int i=n-1;i>=0;i--){
int[] tmp=new int[2];
for(int j=0;j<i;j++){
if(ranges[j][0]>ranges[j+1][0]){
tmp=ranges[j];
ranges[j]=ranges[j+1];
ranges[j+1]=tmp;
}
}
}
int start=ranges[0][0],end=ranges[0][1];
for(int i=1;i<n;i++){
if(ranges[i][0]<=end || ranges[i][0]-1==end){
end=ranges[i][1]<end?end:ranges[i][1];
}else{
bigrange.add(new int[]{start,end});
start=ranges[i][0];
end=ranges[i][1];
}
}
bigrange.add(new int[]{start,end});
for(int[] range:bigrange){
System.out.println(Arrays.toString(range));
if(left>=range[0] && right<=range[1]){
return true;
}
}
return false;
}
}
四、总结:
结果截图
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐
希望对你有帮助,期待您找到心意的工作和满意的offer
期待下次再见~
🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注Jam,从你我做起!