偷懒,直接用了Merge Interval的代码。。。
吧那个Interval加入到前面的vector,然后就和Merge Interval一样的了。。。TAT
..几天前才写过的代码,结果都又是各种问题。。。唉。。。代码能力啊。。。。
/** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0), end(0) {} * Interval(int s, int e) : start(s), end(e) {} * }; */ bool cmp(const Interval& a , const Interval& b){ return a.start < b.start; } class Solution { public: vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) { intervals.push_back(newInterval); sort(intervals.begin(),intervals.end() , cmp); vector<Interval> ans; int size = intervals.size(); if(size == 1) return intervals; int start = intervals[0].start; int end = intervals[0].end; for(int i = 1 ; i < size ;){ while(i < size && intervals[i].start <= end) { if(intervals[i].end > end) end = intervals[i].end; i++; } ans.push_back(Interval(start , end)); start = intervals[i].start; end = intervals[i].end; } // ans.push_back(Interval(start , end)); return ans; } };
--update 2014/01/25
之前的做法毕竟太屌丝。。。
正常做法应该是
找到start的位置
因为是按start排序好了的,所以我们的start,必然是>前面所有的end
start = min(start , interals[i].start) //如果插入的是最后的,那么不需要这个判断
然后呢,从后面的来看。。如果后面的start《=我们的end,那么合并
插入这个新的
/** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0), end(0) {} * Interval(int s, int e) : start(s), end(e) {} * }; */ class Solution { public: vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) { int start = newInterval.start; int end = newInterval.end; int i = 0; vector<Interval> ans; for( ; i < intervals.size() && start > intervals[i].end ; i++) { ans.push_back(intervals[i]); } //found i , not the last if (i < intervals.size()) start = min(start, intervals[i].start); for(; i < intervals.size() && end >= intervals[i].start ; i++) { end = max(end , intervals[i].end); } ans.push_back(Interval(start,end)); ans.insert(ans.end() , intervals.begin() + i , intervals.end()); return ans; } };
by 1957