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);

}

 

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