Insert Interval Array
来源:互联网 发布:软件体系架构 pdf 编辑:程序博客网 时间:2024/05/23 13:11
思路:
方法一:
类似上一题思想,不断合并,标记,最后在排序,写的很烂。
Runtime Error
原因应该是爆栈了。
void quick_sort(vector<Interval> &array, int left, int right) { if(left < right) { int i = left, j = right; Interval x = array[i]; while(i < j) { while(i < j && array[j].start >= x.start) { --j; } if(i < j) { swap(array[i], array[j]); ++i; } while(i < j && array[i].start < x.start) { ++i; } if(i < j) { swap(array[i], array[j]); --j; } } array[i] = x; quick_sort(array, left, i - 1); quick_sort(array, i + 1, right); }}void clear(Interval &x) { x.start = 1; x.end = 0;}vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) { int n = intervals.size(); vector<Interval> ans; for(int i = 0; i < n; ++i) { if(newInterval.start > intervals[i].end || newInterval.end < intervals[i].start) { continue; } if(newInterval.start == intervals[i].end) { newInterval.start = intervals[i].start; clear(intervals[i]); }else if(newInterval.end == intervals[i].start) { newInterval.end = intervals[i].end; clear(intervals[i]); }else { newInterval.start = min(newInterval.start, intervals[i].start); newInterval.end = max(newInterval.end, intervals[i].end); clear(intervals[i]); } } //delete for(int i = 0; i < n; ++i) { if(!(intervals[i].start == 1 && intervals[i].end == 0)) { ans.push_back(intervals[i]); } } ans.push_back(newInterval); show(ans); quick_sort(ans, 0, n - 1); return ans;}
要利用好原array已经排序好的事实。
方法二:TLE。
看到没pass的数据为:
intervals : [1,2],[2,3],[3,4],[4,5],....,[19999,20000]newInterval : [0,20001]
这样就会一直走if…else…的第三个分支,会不停的erase数组。
时间复杂度O(N),空间复杂度O(1)。
/** * 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) { vector<Interval>::iterator it = intervals.begin(); while(it != intervals.end()) { if(newInterval.end < it->start) { intervals.insert(it, newInterval); return intervals; }else if(newInterval.start > it->end) { it++; continue; }else { newInterval.start = min(it->start, newInterval.start); newInterval.end = max(it->end, newInterval.end); it = intervals.erase(it); } } intervals.insert(intervals.end(), newInterval); return intervals; }};
方法三:
相比方法二,它用空间换时间。如果遇到上一方法没pass的数据集,只记录变化,最后才往结果集里加入。
/** * 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) { vector<Interval> res; int n = intervals.size(); for(int i = 0; i < n; ++i) { if(newInterval.end < intervals[i].start) { res.push_back(newInterval); res.insert(res.end(), intervals.begin() + i, intervals.end()); return res; }else if(newInterval.start > intervals[i].end) { res.push_back(intervals[i]); }else { newInterval.start = min(newInterval.start, intervals[i].start); newInterval.end = max(newInterval.end, intervals[i].end); } } res.push_back(newInterval); return res; }};
0 0
- LeetCode[Array]: Insert Interval
- Insert Interval Array
- leetcode.array--57. Insert Interval
- Leetcode-Array-57(insert Interval)
- Insert Interval
- Insert Interval
- Insert Interval
- Insert Interval
- Insert Interval
- Insert Interval
- Insert Interval
- Insert Interval
- Insert Interval
- Insert Interval
- Insert Interval
- Insert Interval
- Insert Interval
- Insert Interval
- Android 增强版百分比布局库 为了适配而扩展
- 数据在计算机中的存储形式和运算( 原码,反码,补码)&=, |=, >>=, <<=, ∧=
- 查找(一)静态表查找
- Mali GPU OpenGL ES 应用性能优化--测试+定位+优化流程
- "n\x45y\123\t"长度
- Insert Interval Array
- Android 进阶学习:Android自定义View的实现方法,带你一步步深入了解View(四)
- Xcode_缓存清理
- Codeforces Round #229 (Div. 2) A. Inna and Alarm Clock
- sql中DISTINCT的用法
- HttpServletRequest对象
- Android 进阶学习:事件分发机制完全解析,带你从源码的角度彻底理解(上)
- linux学习笔记
- sql中GROUP BY的使用