首页 > 其他 > 详细

LeetCode--Insert Interval

时间:2014-08-27 23:11:38      阅读:297      评论:0      收藏:0      [点我收藏+]

其实可以O(n)的思路,如下

 1 class Solution {
 2 public:
 3     vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
 4         // Start typing your C/C++ solution below
 5         // DO NOT write int main() function
 6     //Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].
 7         //check input;
 8         int sz = intervals.size();
 9         vector<Interval> res;
10         
11         for(int i=0; i<sz; i++) {
12             if(intervals[i].end < newInterval.start) {
13                 res.push_back( intervals[i]);
14             } else if( intervals[i].start > newInterval.end) {
15                 res.push_back( newInterval);
16                 res.insert(res.end(), intervals.begin()+i, intervals.end() );
17                 return res;
18             } else {
19                 newInterval.start = min(newInterval.start, intervals[i].start);
20                 newInterval.end = max(newInterval.end, intervals[i].end);
21             }
22         }
23         res.push_back(newInterval); 
24         return res;
25     }

 

一开始想着用二分查找找到新插入区间的前后分别在哪个现有区间内,但是写到一半发现当不在任何区间内的情况不太好处理

未完成代码如下

 1 /**
 2  * Definition for an interval.
 3  * struct 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 class Solution {
11 public:
12     vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
13         vector<Interval> res;
14         if(intervals.size() == 0){
15             res.push_back(newInterval);
16             return res;
17         }
18         
19         int newS = newInterval.start;
20         int newE = newInterval.end;
21         
22         int indS = findIndex(newS,intervals);
23         int indE = findIndex(newE,intervals);
24         if(indS == -1 && indE != -1){
25             Interval tmp(newS,intervals[indE].end);
26             res.push_back(tmp);
27             for(int i = indE+1 ; i < intervals.size() ; ++i){
28                 res.push_back(intervals[i]);
29             }
30         }
31         else if(indS != -1 && indE == -1){
32             for(int i = 0 ; i < indS ; ++i){
33                 res.push_back(intervals[i]);
34             }
35             Interval tmp(intervals[indS].start,newE);
36             res.push_back(tmp);
37         }
38         else if(indS != -1 && indE != -1){
39             int i;
40             for(i = 0 ; i < indS ; ++i){
41                 re.push_back(intervals[i]);
42             }
43             Interval tmp(intervals[indS].start,intervals[indE].end);
44             res.push_back(tmp);
45             for(i = indE+1 ; i < intervals.size() ; ++i){
46                 res.push_back(intervals[i]);
47             }
48         }
49         else{
50             if(newS > intervals[intervals.size()-1].end){
51                 
52             }
53         }
54         return res;
55     }
56     int findIndex(int val,vector<Interval> &intervals){
57         int left = 0;
58         int right = intervals.size()-1;
59         while(left <= right){
60             int mid = left + (right - left)>>1;
61             if(intervals[mid].start <= val && intervals[mid].end >= val){
62                 return mid;
63             }
64             else if(val > intervals[mid].end){
65                 left = mid+1;
66             }
67             else{
68                 right = mid-1;
69             }
70         }
71         return -1;
72     }
73 };

 

LeetCode--Insert Interval

原文:http://www.cnblogs.com/cane/p/3940417.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!