[LeetCode]Merge Intervals && Insert Interval

来源:互联网 发布:pkpm软件视频教程 编辑:程序博客网 时间:2024/05/29 09:36

Merge Intervals

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].

LeetCode: https://oj.leetcode.com/problems/merge-intervals/ 

题解:这道题要求合并所有重叠的区间,当我们看到这道题时,脑子里肯定会产生一根数轴,然后又很多区间段,题目就是要就将有重叠的区间段合并;所以对于这道题,我们首先要做的就是排序,因为排序有助于使问题变得更加清晰,排序的原则:对于区间[s, e],我们首先按s从小到大排序,当s相同时,按e从小到大排序。合并的过程就是比较前一个区间[s1, e1]和相邻的后一个区间[s2, e2]中,e1 和 s2 的大小,如果 e1 < s2,区间无法合并;反之,合并区间。

public class Solution {    public List<Interval> merge(List<Interval> intervals) {        List<Interval> result = new ArrayList<Interval>();        if(intervals == null || intervals.size() == 0)            return result;                    Comparator<Interval> comp = new Comparator<Interval>(){            @Override            public int compare(Interval o1, Interval o2){                if(o1.start == o2.start)                    return o1.end - o2.end;                return o1.start - o2.start;            }        };        Collections.sort(intervals, comp);        for(Interval elem : intervals){            if(result.isEmpty()){                result.add(elem);            }else{                if(elem.start > result.get(result.size()-1).end)                    result.add(elem);                else{                    result.get(result.size()-1).end = Math.max(elem.end, result.get(result.size()-1).end);                }            }        }        return result;    }}

Insert Interval

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

You may assume that the intervals were initially sorted according to their start times.

Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

LeetCode:https://oj.leetcode.com/problems/insert-interval/

题解:这道题其实是上面那道题的一个步骤,首先各个区间都已经排好序,所以排序那一步不用做,接下来就是找位置和Merge,区间集合中第i个区间表示为[si, ei],需要插入的区间newInterval表示为[nsi, nei],则所有满足ei < nsi的区间[si, ei]均在newInterval前面;接下来对于ei < nei的区间均进行合并;代码如下:

public class Solution {    public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) {       ArrayList<Interval> res = new ArrayList<Interval>();    if(intervals.size()==0)    {        res.add(newInterval);        return res;    }    int i=0;    while(i<intervals.size() && intervals.get(i).end<newInterval.start)    {        res.add(intervals.get(i));        i++;    }    if(i<intervals.size())        newInterval.start = Math.min(newInterval.start, intervals.get(i).start);    res.add(newInterval);    while(i<intervals.size() && intervals.get(i).start<=newInterval.end)    {        newInterval.end = Math.max(newInterval.end, intervals.get(i).end);        i++;    }    while(i<intervals.size())    {        res.add(intervals.get(i));        i++;    }    return res;    }}

0 0