[LeetCode]Merge Intervals

来源:互联网 发布:闸机 软件 编辑:程序博客网 时间:2024/05/22 01:26

Question


本题难度Hard。

排序+双指针

【复杂度】
时间 O(Nlog(N)) 空间 O(N)

【思路】
先按照每个元素的start从小到大进行排序。然后利用双指针法,设置区间(low,high),如果新的元素istart要大于high,说明(low,high)没有overlap,就将(low,high)放入结果中,然后将双指针移动:

low=i.start;high=i.end;

否则就进行合并。

【注意】

1、第30行别忘写了,循环中并没有让最后一个间隔加入到结果中

2、判断重叠的边界时包含等于的情况

3、在sort方法中,我本来想写成:

private void sort(List<Interval> intervals) {

不过这样做比较麻烦,因为是sort in place。所以我改为:

private List<Interval> sort(List<Interval> intervals) {

返回的是重新生成的List<Interval>对象

【附】
[Leetcode] Merge Intervals and Insert Interval 合并间隔与插入间隔对Collection的排序方法要更为简单方便:

// 按照起点排序Collections.sort(intervals, new Comparator<Interval>(){    public int compare(Interval i1, Interval i2){        return i1.start - i2.start;    }});

【代码】

/** * 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 List<Interval> merge(List<Interval> intervals) {        //require        List<Interval> ans=new LinkedList<Interval>();        if(intervals==null)            return ans;        if(intervals.size()<1)            return ans;        //sort        List<Interval> sorted=sort(intervals);        //invariant        int low=sorted.get(0).start,high=sorted.get(0).end;        for(Interval i:sorted){            if(high<i.start){                ans.add(new Interval(low,high));                low=i.start;high=i.end;            }else{                high=Math.max(high,i.end);            }        }        ans.add(new Interval(low,high));        //ensure        return ans;    }    private List<Interval> sort(List<Interval> intervals) {        int size=intervals.size();        //base case        if(size<2)            return intervals;        Interval mid=intervals.get(size/2);        int pivot=mid.start;        List<Interval> lefts=new LinkedList<Interval>(),rights=new LinkedList<Interval>(),ans=new LinkedList<Interval>();         for(Interval i:intervals){            if(i.start<pivot)                lefts.add(i);            else if(i.start>pivot)                rights.add(i);            else                mid.end=Math.max(i.end,mid.end);        }        for(Interval i:sort(lefts)){            ans.add(i);        }        ans.add(mid);        for(Interval i:sort(rights)){            ans.add(i);        }        return ans;    }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 魂飞魄散的上古大仙在修真界诈尸 快穿:大佬她又抢了反派剧本 夫人她总想逃 穿成阴戾反派未来嫂嫂 上神大人他偏甜系啊 咸鱼后妈带崽在综艺当对照组 系统BUG让我成了舔包专业户 快穿:系统有的是力气和手段 当我的霸总老公有了读心术 穿成炮灰渣妻后我和反派开农场 前任小姐姐帅又飒 弄潮1990从厂长开始 光阴之外 心动侵占 重回逃荒开端,手握空间来逆袭 重生之网红教父 蛮荒求生:反派大佬被迫种田 玄学大佬在星际重建地府 总裁又惹火夫人了 农门空间:重生娇娘撩糙汉 重生后我弃了天运之子 快穿:绑定系统后我疯狂崩人设 慕爷你虐错了夫人就是白月光 欢乐班 快穿之反派今天也在求负责 喜提娇夫:快穿作精她被迫崛起了 修真大佬都是我 唐人的餐桌 重生之大小姐她换了黑莲花剧本 重回九零做学霸 穿越星际之直播探险生活 我在古代做美食博主 小机器人每天都在劝我追校草 救命!隐婚老公当着全球撩我 仙子她一心修仙 快穿:主神他好撩人 修真界如今不太平 我与帝君虚情假意后he了 女法医她靠玄学飒翻天 蜜糖冰语 穿越年代:手握三室一厅被娇宠!