力扣-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]);
    }
}

程序运行效率:
在这里插入图片描述

此程序效率并不算高,若想查看更多优质代码,请查看力扣官方题解。

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