博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode/LintCode] Merge Intervals
阅读量:5945 次
发布时间:2019-06-19

本文共 2482 字,大约阅读时间需要 8 分钟。

Problem

Given a collection of intervals, merge all overlapping intervals.

Example

Given intervals => merged intervals:[                     [  [1, 3],               [1, 6],  [2, 6],      =>       [8, 10],  [8, 10],              [15, 18]  [15, 18]            ]]

Challenge

O(n log n) time and O(1) extra space.

Note

方法上没太多难点,先按所有区间的起点排序,然后用pre和cur两个指针,如果有交集进行merge操作,否则pre向后移动。由于要求O(1)的space,就对原数组直接进行操作了。

时间复杂度O(nlogn)Collections.sort()的时间。for循环是O(n)
这道题有两个点:
学会使用Collections.sort(object, new Comparator<ObjectType>(){})进行排序;
对于要进行更改的数组而言,其一,for循环不要用for (a: A)的形式,会出现ConcurrentModificationException的编译错误,文档是这样解释的:it is not generally permissible for one thread to modify a Collection while another thread is iterating over it. 其二,对intervalscur元素进行删除操作之后,对应的index i要减去1。

Solution

Update 2018-9

class Solution {    public List
merge(List
intervals) { if (intervals == null || intervals.size() < 2) return intervals; intervals.sort((i1, i2) -> i1.start-i2.start); List
res = new ArrayList<>(); int start = intervals.get(0).start, end = intervals.get(0).end; //use two variables to maintain prev bounds for (Interval interval: intervals) { //iterate the interval list if (interval.start > end) { //if current interval not overlapping with prev: res.add(new Interval(start, end)); //1. add prev to result list start = interval.start; //2. update prev bounds end = interval.end; } else end = Math.max(end, interval.end); //else just update prev end bound } res.add(new Interval(start, end)); //add the prev which was updated by the last interval return res; }}
in-place
class Solution {    public List
merge(List
intervals) { if (intervals == null || intervals.size() < 2) return intervals; intervals.sort((i1, i2) -> i1.start-i2.start); Interval pre = intervals.get(0); for (int i = 1; i < intervals.size(); i++) { Interval cur = intervals.get(i); if (cur.start > pre.end) pre = cur; else { pre.end = Math.max(pre.end, cur.end); intervals.remove(cur); i--; } } return intervals; }}

转载地址:http://bdzxx.baihongyu.com/

你可能感兴趣的文章
SSM项目整合Quartz
查看>>
rabbitmq安装集群
查看>>
ZOJ2158,POJ1789
查看>>
[转]C#多线程学习(四) 多线程的自动管理(线程池)
查看>>
shell 脚本
查看>>
世界在音乐中得到了完整的再现和表达。
查看>>
数据分析推荐书籍
查看>>
平衡的括号
查看>>
iphone 使用popViewController如何避免内存泄露
查看>>
Redis和MySQL数据同步及Redis使用场景
查看>>
字符串最小编辑距离
查看>>
关于编程
查看>>
Oracle Database 快捷版 安装 连接
查看>>
java-数组排序--冒泡排序、鸡尾酒排序、地精排序
查看>>
bzoj3876
查看>>
bzoj3996
查看>>
flex中toolTip汇总
查看>>
Oracle脚本批量导入时,输出日志文件
查看>>
常用的正则表达式
查看>>
MFC中的MainFrame Dlg,App,Doc,View的关系
查看>>