57. Insert Interval

来源:互联网 发布:举例说明算法的可行性 编辑:程序博客网 时间:2024/05/22 12:23

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

题意有点晦涩,翻译一下就是例如给你[1,2],[3,5],[6,7],[8,10],[12,16], 现在插入一个[4,9] 进行合并,问合并之后是什么样子,这个例子合并之后应该是 [1,2],[3,10],[12,16].这个样子。

思路和题56差不多,要多处理一下这个新插入的区间。

给定的区间集合是有序的,把【新区间】,插入到原来区间集合里的【合适位置】,所谓合适位置就是原来集合是按区间左端点升序排列的,插入以后还要满足新集合按照左端点升序排列,再套用题Merge Intervals的处理办法进行合并。


public List<Interval> insert(List<Interval> intervals, Interval newInterval){List<Interval> retlist=new ArrayList<>();int len=intervals.size();if(len<1){retlist.add(newInterval);return retlist;}int index=0;while(index<len&&newInterval.start>=intervals.get(index).start)index++;if(newInterval.start<intervals.get(0).start)intervals.add(0, newInterval);else {intervals.add(index, newInterval);}len++;boolean[] used=new boolean[len];for(int i=0;i<len;i++)if(!used[i]){used[i]=true;Interval in1=intervals.get(i);int newstart=in1.start;int newend=in1.end;for(int j=i+1;j<len;j++)if(!used[j]){Interval in2=intervals.get(j);if(in2.start<=newend){newend=Math.max(newend, in2.end);used[j]=true;}else {break;}}retlist.add(new Interval(newstart, newend));}return retlist;}


0 0
原创粉丝点击