Leetcode56: 合并区间--hammring

题目描述:

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

示例 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] 可被视为重叠区间。

解题思路:

1.先对二维数组的第一个数字进行排序;

2.设二维数组的第一个数为left,第二个数为right。i不能到最后一行,right和下一行的left比较大小对right重新赋值。最后得到的区间即为合并的区间。

具体代码如下:

class Solution {
    public int[][] merge(int[][] intervals) {
       if(intervals == null && intervals.length ==1){
           return intervals;
       }
       //合并区间的形式为 [[1,6],[8,10],[15,18]],因此使用ArrayList。
        List<int[]> list = new ArrayList<>();
       //对数组的第一个数进行比较,按从小到大的顺序排列
        Arrays.sort(intervals,new Comparator<int[]>(){
            public int compare(int[] a,int[] b){
                return a[0]-b[0];
            }
        });
        int i=0;
        int n=intervals.length;
        while(i<n){
            //left为二维数组的第一个数,right为二维数组的第二个数
            int left = intervals[i][0];
            int right = intervals[i][1];
            //i不可能到最后一行,否则right和下一行数组的第一个数的比较就没有意义
            //right和下一行数组的left比较,对right重新赋值。
            while(i<n-1 && right>=intervals[i+1][0]){
                right = Math.max(right,intervals[i+1][1]);
                i++;
            }
            //list存放的内容即为合并区间后的内容。
            list.add(new int[]{left,right});
            i++;
        }
        return list.toArray(new int[list.size()][2]);
    }
}

知识点:

1.代码中使用了比较器Comparator,实际上是对compare方法进行了重写。即当o1小于02,o1等于o2,o1大于o2分别返回-1,0,1。

public interface Comparator<T> {

      int compare(T o1, T o2);

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章