给出一个区间的集合,请合并所有重叠的区间。

示例 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][]);
}

程浩
21 声望2 粉丝

« 上一篇
55. 跳跃游戏
下一篇 »
57. 插入区间