[LeetCode - 排序] 56. Merge Intervals

1 问题

Given a collection of intervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

2 分析

题目要合并重叠的区间,直觉上需要将区间排序。排序的方法是:

  • 先按照区间左端点排序
  • 如果左端点相同,再按照右端点排序

假设排序后的区间为 [[a1,a2],[a3,a4],[a5,a6]...] ,便可以从左到右,逐个合并区间。下面以 [a1,a2],[a3,a4] 为例,根据 a2 a3,a4 的位置关系,可以分为以下情况:

  1. a2<a3 这种情况下,两个区间不需要合并.
  2. a3a2a4 这种情况下,这两个区间需要合并,合并后区间的左端点是 a1 , 右端点是 a4 .
  3. a2>a4 这种情况下, 这两个区间需要合并,合并后区间的左端点是 a1 , 右端点是 a2 .

重复以上步骤,直到所有的区间都被合并处理。

3 代码

public class Solution {
    public List<Interval> merge(List<Interval> intervals) {
        Collections.sort(intervals, 
                    new Comparator<Interval>(){
                        public int compare(Interval o1, Interval o2){
                            if(o1.start != o2.start){
                                return o1.start - o2.start;    
                            }else{
                                return o1.end - o2.end;
                            }
                        }
                    }
        );

        int i = 0;
        while(i < intervals.size() - 1){
            if(intervals.get(i).end >= intervals.get(i+1).start){
                intervals.get(i).end = Math.max(intervals.get(i).end, intervals.get(i+1).end);
                intervals.remove(i+1);
            }else{
                i = i + 1;
            }
        }
        return intervals;
    }
}

代码中有以下几点需要注意:

  • 使用Collections.sort方法对List进行排序
  • Comparator<T>()接口可以使用lambda表达式代替,简化代码
  • while()循环可以用iterator代替,使逻辑更加清晰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值