leetcode56合并区间

leetcode56合并区间
题目:
给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
解法:我没有什么好的解法,只能靠笨办法
例如:
A:1 3
B:2 6
怎么判断A和B是否有区间重叠
判断方法:A的右>=B的左&&A的左<=B的右
基于这一判断条件我们试试这个例子
1 8
2 3
4 5
6 7
第一步i=0
a:1 8
b:2 3
有重叠区间
intervals[i+1][0]=Math.min(al,bl);//al是a的左边,bl是b的左边
intervals[i+1][1]=Math.max(ar,br);
即原二维数组变为
1 8
1 8
4 5
6 7
第二步i=1
1 8
4 5
有重叠区间
intervals[i+1][0]=Math.min(al,bl);//al是a的左边,bl是b的左边
intervals[i+1][1]=Math.max(ar,br);
即原二维数组变为
1 8
1 8
1 8
6 7
第三步i=2
1 8
6 7
有重叠区间
intervals[i+1][0]=Math.min(al,bl);//al是a的左边,bl是b的左边
intervals[i+1][1]=Math.max(ar,br);
即原二维数组变为
1 8
1 8
1 8
1 8
第四步i=3
只剩下1 8了,这个就是答案
如果原数组变成
2 3
4 5
6 7
1 8
我们这个算法就有严重的bug,具体什么bug自己模拟一遍就出来了,解决这个bug,排个序就好了

public static int[][] merge(int[][] intervals) {
        if(null==intervals||intervals.length==0||intervals.length==1)return intervals;
        Arrays.sort(intervals,new Comparator<int[]>(){
            @Override
            public int compare(int[] a,int[] b){
                return a[0]-b[0];
            }
        });
        int al,ar,bl,br;
        List<int[]> resList = new ArrayList<>();
        for(int i=0;i<intervals.length-1;i++){
            al = intervals[i][0];//1
            ar = intervals[i][1];//3
            bl = intervals[i+1][0];//2
            br = intervals[i+1][1];//6
            if(hasPartition(al,ar,bl,br)){//重叠区间
                intervals[i+1][0]=Math.min(al,bl);
                intervals[i+1][1]=Math.max(ar,br);
            }else{//没有重叠区间加进去
                int[] res = new int[2];
                res[0]=al;
                res[1]=ar;
                resList.add(res);
            }
            //i<intervals.length-1导致最后一个没有加进去,这里加进去
            if(i==intervals.length-2){
                int[] res = new int[2];
                res[0]=intervals[i+1][0];
                res[1]=intervals[i+1][1];
                resList.add(res);
            }
        }
        return resList.toArray(new int[resList.size()][2]);
    }
    public static boolean hasPartition(int al,int ar,int bl,int br){
        return ar>=bl&&al<=br;
    }
发布了127 篇原创文章 · 获赞 68 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/LiuRenyou/article/details/100599988