给出一个区间的集合,请合并所有重叠的区间。示例 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] 可被视为重叠区间。
主要是找到这个规律,在一段区间内,没有出现左右相等的情况,只取左右就可以
public int[][] merge(int[][] intervals) {
List<Integer> l1=new ArrayList();
List<Integer> l2=new ArrayList();
for(int[] a:intervals){
l1.add(a[0]);
l2.add(a[1]);
}
Collections.sort(l1);
Collections.sort(l2);
LinkedList<Integer> left=new LinkedList(l1);
LinkedList<Integer> right=new LinkedList(l2);
Stack<Integer> stack=new Stack();
List<int[]> ret=new ArrayList();
while(!left.isEmpty() || !right.isEmpty()){
int l=Integer.MAX_VALUE;
int r=Integer.MAX_VALUE;
if(!left.isEmpty()) l=left.peek();
if(!right.isEmpty()) r=right.peek();
if(l<=r){
stack.add(l);
left.poll();
}else{
right.poll();
int t=stack.pop();
if(stack.isEmpty()) ret.add(new int[]{t,r});
}
}
int[][] ret1=new int[ret.size()][2];
for(int i=0;i<ret.size();i++){
ret1[i]=ret.get(i);
}
return ret1;
}
解没问题,但代码太挫了,参考另一个比较好看的解法
public int[][] merge(int[][] intervals) {
List<int[]> list=new ArrayList();
if(intervals.length==0) return list.toArray(new int[0][]);
Arrays.sort(intervals,Comparator.comparingInt(o->o[0]));
for(int i=0;i<intervals.length;i++){
if(list.size()==0 || intervals[i][0]>list.get(list.size()-1)[1]) list.add(intervals[i]);
else list.get(list.size()-1)[1]=Math.max(list.get(list.size()-1)[1],intervals[i][1]);
}
return list.toArray(new int[0][]);
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。