标签:vector log 依次 out 需要 返回 遍历 private col
由于intervals已经有序,不需要排序。本题是要返回一个interval数组,所以并不需要对原数组进行改动。
由于intervals有序,我们可以二分找到应该插入的位置,然后merge intervals即可。
时间复杂度 O(n)
我们只需要找出overlap的部分,merge即可。别的没有overlap的部分保持不变。
class Solution { public: vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) { vector<vector<int>> res; int i=0; while (i<intervals.size() && intervals[i][1]<newInterval[0]){ res.push_back(intervals[i++]); } while (i<intervals.size()){ if (newInterval[1]<intervals[i][0]) break; // no overlap newInterval[0] = min(newInterval[0], intervals[i][0]); newInterval[1] = max(newInterval[1], intervals[i][1]); ++i; } res.push_back(newInterval); while (i<intervals.size()){ res.push_back(intervals[i++]); } return res; } };
时间复杂度 O(n)
Linkedin 经典题,设计一个class,支持addInterval(int left, int right),getTotalCovered()
priority queue不太方便遍历,改用set。遍历set,思想和merge interval一样。
这种方法的缺点是并不会merge overlap的interval,如果需要merge,可以用上题的思路,但是最好直接in place修改,否则新建一个set,依次insert的时间复杂度会很高。
typedef pair<int,int> pi; class Intervals{ private: set<pi> s; public: void addInterval(int left, int right){ // O(logn) s.insert({left,right}); } int getTotalCovered(){ // iterate set, O(n) if (s.size()==0) return 0; int res=0; pi prev={INT_MIN,INT_MIN}; for (auto x:s){ if (prev.second<x.first){ res += prev.second-prev.first; prev = x; }else{ prev.second = max(prev.second, x.second); } } res += prev.second-prev.first; return res; } }; int main() { Intervals intervals; intervals.addInterval(1,2); intervals.addInterval(3,5); intervals.addInterval(6,7); intervals.addInterval(8,10); intervals.addInterval(12,16); cout << intervals.getTotalCovered() << endl; intervals.addInterval(4,8); cout << intervals.getTotalCovered() << endl; return 0; }
时间复杂度 addInterval O(logn) getTotalCovered O(n)
当然也可以用上题的方法,维护一个sorted的array,每次 O(n) 时间merge interval,addInterval 和 getTotalCovered 都为 O(n)。
LeetCode 57. Insert Interval / Add Interval (get total covered length)
标签:vector log 依次 out 需要 返回 遍历 private col
原文地址:https://www.cnblogs.com/hankunyan/p/11658141.html