Merge Intervals

来源:互联网 发布:淘宝刷粉丝怎么刷 编辑:程序博客网 时间:2024/06/07 09:54
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].


 CSDN博客挂了,可能是和新浪接口那边出了问题,我是用新浪帐号登录的。
 首先,是合并的规则
if(A.end<B.end&&A.end>B.start)
{
if(A.start<B.start)
B.start=A.start;
}//A的end在B的范围里面
if(A.start>B.start&&A.start<B.end)
{
if(A.end>B.end)
B.end=A.end
}//如果A的start在B的范围里面
还有一个不要漏掉了,就是B是被A包含的,即A.start<B.start&&A.end>B.end
一开始漏掉了最后一个条件判断。
所以相比之下还是比较喜欢这个而不是acm,因为acm错误的话没有给出例子。

其次是运算规则,
1:从示例中提出去第一个范围,然后依次和剩下的范围合并,从原来的示例中移去合并过的范围。
2:直至遍历一遍后。把这个新的范围加到结果集中。
3:依次重复以上步骤。

在这里,是另一个坑。因为示例给的范围可能是未排序的,因此有可能出现这种情况:
[[1,2],[3,4],[5,6],[7,8],[1,10]]
如果按照上面的结果,那么就会出现
结果为[[1,10],[3,4],[5,6],[7,8]]
因为第一次遍历后把[1,10]给移出,并且不会出现在后面的任何计算中。
因此,参考Floyd算法,对结果进行再次的合并。
重复的次数为一开始实例的子集个数。

这样子复杂度是O(n^3)
有点高,改进的话,应该是先开始对范围进行排序

还有一个小的地方要注意,在对List进行remove操作,位置i应该--后再++
比如remove(i);i++

这个时候,i实际上是指向原来i后面的第二个而不是i后面的第一个。

上代码:


import java.util.ArrayList;import java.util.List;import javax.swing.text.StyledEditorKit.ForegroundAction;public class 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]. *  */// 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> mergetmp(List<Interval> intervals) {List<Interval> resultIntervals = new ArrayList<Interval>();for (; intervals.size() > 0;) {Interval intervaltmp = intervals.remove(0);for (int i=0;i<intervals.size();++i) {if (intervals.get(i).end <= intervaltmp.end&& intervals.get(i).end >= intervaltmp.start) {if (intervals.get(i).start <= intervaltmp.start)intervaltmp.start = intervals.get(i).start;intervals.remove(i);i--;}elseif (intervals.get(i).start >= intervaltmp.start&& intervals.get(i).start <= intervaltmp.end) {if (intervals.get(i).end >= intervaltmp.end)intervaltmp.end = intervals.get(i).end;intervals.remove(i);    i--;}else if(intervals.get(i).start<=intervaltmp.start&&intervals.get(i).end>=intervaltmp.end){intervaltmp.start=intervals.get(i).start;intervaltmp.end=intervals.get(i).end;intervals.remove(i);i--;}}resultIntervals.add(intervaltmp);}return resultIntervals;}public List<Interval> merge(List<Interval> intervals){List<Interval> resultIntervals = intervals;int count=intervals.size();for(int i=0;i<count;++i){resultIntervals=mergetmp(resultIntervals);}return resultIntervals;}}public static void main(String[] args) {// TODO Auto-generated method stub}}


0 0
原创粉丝点击