LeetCode OJ: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].

  类似以前的merge Intervals,只不过这里实际上是要将一个Interval插入到内部之后,然后再merge一下
而且这里的intervals在这里首先是已经排好序了的:

首先是一个带二分搜索的C++的方法:

 1 class Solution {
 2 public:
 3     static bool comp(Interval a,Interval b){
 4         return a.start<b.start;
 5     }
 6     vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
 7         if(intervals.size()==0){
 8             intervals.push_back(newInterval);
 9             return intervals;
10         }
11         // sort(intervals.begin(),intervals.end(),comp);
12         if(intervals[0].start>newInterval.end){
13             intervals.insert(intervals.begin(),newInterval);
14             return intervals;
15         }
16         else if(intervals[intervals.size()-1].end<newInterval.start){
17             intervals.push_back(newInterval);
18             return intervals;
19         }
20         int left = binaryS(newInterval.start,intervals,0,intervals.size()-1, true);
21         int right = binaryS(newInterval.end, intervals,left, intervals.size()-1,false);
22         int delLeft,delRight;
23         cout<<left<<right;
24         if(left == 0 && intervals[0].start>newInterval.start){
25             delLeft = left;
26         }
27         else if(intervals[left].end>= newInterval.start){
28             newInterval.start = intervals[left].start;
29             delLeft = left;
30         }
31         else{
32             delLeft = left+1;
33         }
34 
35         if(right == intervals.size()-1 && intervals[right].end<newInterval.end){
36             delRight = right;
37         }
38         else if(intervals[right].start<= newInterval.end){
39             newInterval.end = intervals[right].end;
40             delRight = right;
41         }
42         else{
43             delRight = right-1;
44         }
45         cout<<delLeft<<" "<<delRight<<endl;
46         vector<Interval> result;
47 
48         for(int i=0;i<delLeft;i++){
49             result.push_back(intervals[i]);
50         }
51         result.push_back(newInterval);
52         for(int i=delRight+1;i<intervals.size();i++){
53             result.push_back(intervals[i]);
54         }
55         return result;
56         // for(int i=delLeft;i<=delRight;i++){
57         //     intervals.erase(intervals.begin()+delLeft);
58         // }
59         // intervals.push_back(newInterval);
60         // return intervals;
61     }
62     int binaryS(int x, vector<Interval> & intervals, int low, int high, bool isStart){
63         if(isStart){
64 
65 
66             while(low < high){
67                 int mid = (low + high +1 ) /2;
68                  cout<<low<<high;
69                 if(intervals[mid].start <= x){
70                     low = mid;
71                 }
72                 else{
73                     high = mid-1;
74                 }
75             }
76         }
77         else{
78             while(low < high){
79                 int mid = (low + high) /2;
80                 // cout<<low<<high;
81                 if(intervals[mid].end < x){
82                     low = mid+1;
83                 }
84                 else{
85                     high = mid;
86                 }
87             }
88         }
89         return low;
90     }
91 };

java版本的代码如下所示:

 1 /**
 2  * Definition for an interval.
 3  * public class Interval {
 4  *     int start;
 5  *     int end;
 6  *     Interval() { start = 0; end = 0; }
 7  *     Interval(int s, int e) { start = s; end = e; }
 8  * }
 9  */
10 public class Solution {
11     public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
12         List<Interval> ret = new ArrayList<Interval>();
13         int sz = intervals.size();
14         if(sz == 0){
15             ret.add(newInterval);
16             return    ret;
17         }
18         int prev = 0, next = 1;
19         while(next < sz){
20             if(newInterval != null && intervals.get(prev).end >= newInterval.start){
21                 intervals.get(prev).end = Math.max(intervals.get(prev).end, newInterval.end);
22                 newInterval = null;
23             }else if(newInterval == null){
24                 if(intervals.get(prev).end >= intervals.get(next).start){
25                     intervals.get(prev).end = Math.max(intervals.get(prev).end, intervals.get(next).end);
26                     next++;
27                 }else{
28                     ret.add(intervals.get(prev));
29                     prev = next;
30                     next++;
31                 }
32             }else{
33                 ret.add(intervals.get(prev));
34                 prev++;
35                 next++;
36             }
37         }
38         intervals.get(prev).end = Math.max(intervals.get(prev).end, intervals.get(sz-1).end);
39         ret.add(intervals.get(prev));
40         return ret;
41     }
42 }
原文地址:https://www.cnblogs.com/-wang-cheng/p/5563536.html