LeetCode上提交 执行时间优于100%的提交记录
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
- 可以认为区间的终点总是大于它的起点。
- 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
示例 1:
输入: [ [1,2], [2,3], [3,4], [1,3] ]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
示例 2:
输入: [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。
示例 3:
输入: [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
思路:每个区间当作一个对象,区间对象 元素保存在 intervals[] 数组种
1)先对区间对象进行排序
2)对相邻的两个区间对象元素进行 取舍/合并 判断
- 如果前面区间的右边界小于或等于后面区间的左边界,不需要合并;如:[1,3] 和 [3,4]
- 如果前面区间的右边界大于后面区间的左边界 且小于后面区间的右边界,舍掉后面的区间;如:[1,3]和[2,4],舍去[2,4]
- 如果前面区间的右边界大于后面区间的右边界,舍掉前面的区间;如:[1,5]和[2,4],舍去[1,5]
下面放上源代码:
package Algorithm.LeetCode;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
class Interval{
int start;
int end;
Interval() { start = 0; end = 0; }
Interval(int s, int e) { start = s; end = e; }
}
public class Solution12 {
public static int eraseOverlapIntervals(Interval[] intervals) {
Arrays.sort(intervals, new Comparator<Interval>() {
@Override
public int compare(Interval o1, Interval o2) {
if(o1.start==o2.start) {
return o1.end-o2.end;
}
return o1.start-o2.start;
}
});
// for (Interval obj:intervals) {
// System.out.println(obj.start+","+obj.end);
// }
int sum = 0;
int next = 1;
for(int i = 0;i<intervals.length-1;){
//System.out.println("i="+i);
if(i+next>=intervals.length)
break;
if(intervals[i]!=null){
if(intervals[i].end<=intervals[i+next].start){
intervals[i].end = intervals[i+next].end;
i++;
next=1;
}
//删除后面一个,i不变
else if(intervals[i].end>intervals[i+next].start&&intervals[i].end<intervals[i+next].end){
intervals[i+next]=null;
next++;
sum++;
//System.out.println("sum="+sum);
}
else{//删除当前
intervals[i]=null;
i++;
next=1;
sum++;
//System.out.println("sum="+sum);
}
}
//节点为空,访问下一个节点
else {
i++;
next=1;
}
}
return sum;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str=sc.nextLine();
String []str1=str.split(" ");
int len = str1.length;
int[] a = new int[len];
for(int i = 0 ;i < len ; i ++){
a[i] = Integer.valueOf(str1[i]);
}
Interval[] b = new Interval[len/2];
for(int i = 0,j=0 ;i<len/2;i++){
Interval obj = new Interval(a[j],a[j+1]);
b[i] = obj;
//System.out.println("i="+i+","+"j="+j);
j+=2;
}
System.out.println(eraseOverlapIntervals(b));
}
}