leetcode: Merge Intervals

本文介绍了如何通过排序和区间比较来实现区间合并算法。详细解释了Java和C++的实现方式,包括如何使用Collections.sort()和重写sort的cmp方法进行排序,以及在结果列表中正确插入Interval对象的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路很简单,首先对输入list排序,使其内数据按照start的大小从小到大排列。  此时当一个区间能够插入的时候,该区间的start肯定要小于当前区间的end,否则该区间和该区间之后的区间都不可插入(因为按照start上升排列),故当前区间可以插入结果列表。    利用这一思想动态更新当前区间并判断插入即可。   需要注意的是

1. Java 要对ArrayList排序,利用Collection.sort()方法,还需要重写Comparator类的compare(Object o1,Object o2)方法;而c++只需重写sort的cmp方法即可

2. 向结果的ArrayList插入Interval时要插入一个新生成的对象,否则对插入对象的修改也会直接改变结果列表中插入的结果的值(ArrayList常插入int会忽视这点)


/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
public class Solution {
    public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
        ArrayList<Interval> res = new ArrayList<Interval>();
        if( intervals == null || intervals.size()==0 )
        {
            return res;
        }
        Interval tmp = new Interval(-1,-1);
        Collections.sort(intervals, new Comparator() {
             @Override
             public int compare(Object o1, Object o2) {
                return ((Interval)o1).start-((Interval)o2).start;
             }
        });
        for( Interval it : intervals )
        {
           if( tmp.start==-1 && tmp.end==-1 )
           {
               tmp.start = it.start;
               tmp.end = it.end;
           }
           else
           {
               if( it.start > tmp.end )
               {
                   res.add(new Interval(tmp.start,tmp.end));
                   tmp.start = it.start;
                   tmp.end = it.end;
               }
               else
               {
                   tmp.start = Math.min(tmp.start,it.start);
                   tmp.end = Math.max(tmp.end,it.end);
               }
           }
        }
        res.add(tmp);
        return res;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值