版权声明:此文章为许诗宇所写,如需转载,请写下转载文章的地址 https://blog.csdn.net/xushiyu1996818/article/details/86071164
题目
合并区间
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
此题不给出测试用例,直接用leetcode测试
解法1(成功,17ms,极快)
两个区间若能合并,则第一个区间的右端点一定不小于第二个区间的左端点。
先将intervals进行排序,将interval的start进行排序,保证list中的start从小到大,然后建立一个list的result,先塞入第一个intervals的东西
然后将intervals从1到length-1进行循环,每次比较now和result里的最后一个prev,
如果now.start>prev.end,说明两个interval不重叠,result里加入一个和now一样的,size++,
如果不一样,说明有重合,满足合并条件,则记录新合并区间的右端点,将prev的end改为两者中最大的那个即可
package pid056;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
class Solution {
public List<Interval> merge(List<Interval> intervals) {
int length=intervals.size();
if(length<=1){
return intervals;
}
Collections.sort(intervals, new Comparator<Interval>() {
public int compare(Interval interval1, Interval interval2) {
return interval1.start-interval2.start;
}
});
List<Interval> result=new ArrayList<>();
result.add(intervals.get(0));
int size=1;
for(int i=1;i<length;i++){
Interval now=intervals.get(i);
Interval prev=result.get(size-1);
//两者隔离
if(now.start>prev.end){
result.add(new Interval(now.start, now.end));
size++;
continue;
}
//两者融合,上一个的end变为两个end中的max
prev.end=Math.max(prev.end, now.end);
}
return result;
}
}