思路:用个index记录当前需要填充的位置,扫一遍就行了,跟quicksort思路一致。复杂度O(n)
- void pushzeros(int A[], int n){
- int index = 0;
- for(int i = 0; i < n; i++){
- if(A[i] != 0){
- int tmp = A[index];
- A[index++] = A[i];
- A[i] = tmp;
- }
- }
- }
[1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].
[1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].
[4,9] overlaps with [3,5],[6,7],[8,10].vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
vector<Interval> res; int i=0; int n = intervals.size(); while(i < n && newInterval.start > intervals[i].end) res.push_back(intervals[i++]); if(i < n) newInterval.start = min(newInterval.start, intervals[i].start); while( i < n && newInterval.end >= intervals[i].start ) i++; if(i > 0) newInterval.end = max(newInterval.end, intervals[i-1].end); res.push_back(newInterval); while(i < intervals.size()) res.push_back(intervals[i++]); return res; }
然后我又写了个修改输入array不需要额外空间的:
vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) { int i=0, from, to; int n = intervals.size(); while(i < n && newInterval.start > intervals[i].end) i++; from = i; if(i < n) newInterval.start = min(newInterval.start, intervals[i].start); while( i < n && newInterval.end >= intervals[i].start ) i++; to = i - 1; if(i > 0) newInterval.end = max(newInterval.end, intervals[i-1].end); if(from <= to) intervals.erase(intervals.begin()+ from, intervals.begin()+ to + 1);
intervals.insert(intervals.begin()+from, newInterval);
return intervals; }
[1,2,0] return 3,[3,4,-1,1] return 2.