给你一些区间算出这些区间中有几个不相交的区间?函数原型如下:





所以上述问题可以转化为如下的代码片段
public int intervalSchedule(int [][] intvs){
if(intvs.length==0)return 0;
//按end升序排序
Arrays.sort(intvs,new Comparator<int[]>(){
public int compare(int []a,int []b){
return a[1]-b[1];
}
});
//至少有一个区间不相交
int count=1;
//排序后,令第一个区间为x
int x_end=intvs[0][1];
for(int [] interval:intvs){
int start=interval[0];
if(start>=x_end){
//找到下一个选择的区间了
count++;
x_end=interval[1];
}
}
return count;
}
LeetCode435号问题可以基于上面的思路给出解答:
class Solution {
//首先求解最多有多少个不相交子集
public int intervalSchedule(int[][] intvs){
if(intvs.length==0){
return 0;
}
Arrays.sort(intvs,new Comparator<int[]>(){
public int compare(int[] a,int []b){
return a[1]-b[1];
}
});
//至少有1个区间不相交
int count=1;
//排序后,第一个期间就是x
int x_end=intvs[0][1];
for(int []interval:intvs){
int start=interval[0];
if(start>=x_end){
//如果找到下一个可选择区间
count++;
x_end=interval[1];//更新end
}
}
return count;
}
public int eraseOverlapIntervals(int[][] intervals) {
return intervals.length-intervalSchedule(intervals);
}
}
本文介绍了一种解决区间调度问题的高效算法,通过将区间按结束时间排序并选择最早结束的区间,实现最大数量的不相交子集选择,进而解决LeetCode435号问题。
1799

被折叠的 条评论
为什么被折叠?



