码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 57. Insert Interval / Add Interval (get total covered length)

时间:2019-10-12 09:21:37      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:vector   log   依次   out   需要   返回   遍历   private   col   

57. Insert Interval

由于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)

 

Add Interval (get total covered length)

Linkedin 经典题,设计一个class,支持addInterval(int left, int right),getTotalCovered()

Set

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!