【LeetCode】解题56:Merge Intervals

Problem 56: Merge Intervals [Medium]

Given a collection of intervals, merge all overlapping intervals.

Example 1:

Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].

Example 2:

Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.

NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.

来源:LeetCode

解题思路

  • 将二维数组按升序排序。
  • 遍历合并区间,设当前区间为[start, end],当intervals[i][1] <= end时合并,取 e n d = max ⁡ ( e n d , i n t e r v a l [ i ] [ 1 ] ) end = \max(end, interval[i][1]) end=max(end,interval[i][1]),否则将[start, end]加入最终结果,重新设置当前区间为[interval[i][0], interval[1]]。
  • 注意:最后一个区间在遍历结束后需要加入最终结果。

整个算法排序后遍历一次数组,时间复杂度为 O ( n l o g n ) O(n log n) O(nlogn)

Solution (Java)

class Solution {
    public int[][] merge(int[][] intervals) {
        int m = intervals.length;
        if(m == 0 || m == 1) return intervals;
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] i1, int[] i2) {
                if (i1[0] == i2[0]) return i1[1]-i2[1];
                return i1[0]-i2[0];
            }
        });
        List<int[]> result = new ArrayList<>();
        int start = intervals[0][0];
        int end = intervals[0][1];
        for(int i = 1; i < m; i++){
            if(intervals[i][0] <= end){
                end = Math.max(end, intervals[i][1]);
            }
            else{
                result.add(new int[] {start, end});
                start = intervals[i][0];
                end = intervals[i][1];
            }
        }
        result.add(new int[] {start, end});
        return result.toArray(new int[result.size()][2]);
    }
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值