1.合并区间
给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
分析:合并区间关键在于寻找是否存在前一个区间的结束值大于后一个区间的开始值,若存在,则这两个区间就可以合并。理解这个并不难,但对数据的处理有一个小技巧,就是将所有区间的开始值和结束值都排好序,这样在合并区间的时候会更简单一些,这也是区间问题常用的套路(呵呵,没错就是套路),排序过后就是合并过程了,具体过程看代码吧。
/**
* 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 merge(List intervals) {
int n=intervals.size();
int[] starts=new int[n];
int[] ends=new int[n];
for(int i=0;i res=new ArrayList();
for(int i=0,j=0;iends[i]){
res.add(new Interval(starts[j],ends[i]));
j=i+1;
}
}
return res;
}
}
2.插入区间
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 1:
输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
输出: [[1,5],[6,9]]
示例 2:
输入: intervals =
[[1,2],[3,5],[6,7],[8,10],[12,16]]
, newInterval =
[4,8]
输出: [[1,2],[3,10],[12,16]]
解释: 这是因为新的区间
[4,8]
与
[3,5],[6,7],[8,10]
重叠。
分析:呵呵呵(忍不住了。。。)这题跟上个题目有区别吗,有区别吗,有.......,如果真说有,那就是把题目给的区间加入到原来的区间的序列中,然后问题就变成合成区间问题了
/**
* 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 insert(List intervals, Interval newInterval) {
intervals.add(newInterval);
int n=intervals.size();
int[] starts=new int[n];
int[] ends=new int[n];
for(int i=0;i res=new ArrayList();
for(int i=0,j=0;iends[i]){
res.add(new Interval(starts[j],ends[i]));
j=i+1;
}
}
return res;
}
}