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

Posted 約束の空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 57. Insert Interval / Add Interval (get total covered length)相关的知识,希望对你有一定的参考价值。

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)的主要内容,如果未能解决你的问题,请参考以下文章

一天一道LeetCode#57. Insert Interval

Leetcode57 Insert Interval

LeetCode57 Insert Interval

Leetcode 57: Insert Interval

leetcode 57. Insert Interval

[LeetCode] 57. Insert Interval Java