力扣-56.合併區間-java實現

56. 合併區間

給出一個區間的集合,請合併所有重疊的區間。

示例 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] 可被視爲重疊區間。

通過次數

71,934

提交次數

174,436

題解:

根據題目分析可知,如果我們按照區間的左端點排序,那麼在排完序的列表中,可以合併的區間一定是連續的。我們將排好序的數組進行循環遍歷,區間重合的進行合併,並用一個集合存放。

算法:

排好序的數組,對其進行合併區間判斷
while i < n
	left = intervals[i][0]
	right = intervals[i][1]
	//此處判斷第i數組的右邊界是否大於第i+1數組的左邊界
	while i < n-1 || right >= intervals[i+1][0]
		//進行合併
		right = Math.max(right,intervals[i+1][1])
		i++
	a = {left,right}
	//將合併的數組放入ArrayList集合中
	list.add(a)
	i++
//集合轉數組
return list.toArray(new int[list.size()][2])

java代碼:

class Solution {
    public int[][] merge(int[][] intervals) {
    	//判空
        if(intervals==null||intervals.length<=1)
            return intervals;
        //定義集合接收合併數組
        List<int[]> list=new ArrayList<>();
        //對數組排序,這裏用了lamda表達式
        Arrays.sort(intervals,(x,y)->x[0]-y[0]);
        int i = 0, n = intervals.length;
        while(i<n){
            int l = intervals[i][0];
            int r = intervals[i][1];
            while(i<n-1&&r>=intervals[i+1][0]){
                r = Math.max(r,intervals[i+1][1]);
                i++;
            }
            int[] a={l,r};
            list.add(a);
            i++;
        }
        //集合轉數組
        return list.toArray(new int[list.size()][2]);
    }
}

程序運行效率:
在這裏插入圖片描述

此程序效率並不算高,若想查看更多優質代碼,請查看力扣官方題解。

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