[leetcode] 352. Data Stream as Disjoint Intervals 解题报告

原创 2016年06月01日 07:24:10

题目链接: https://leetcode.com/problems/data-stream-as-disjoint-intervals/

Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen so far as a list of disjoint intervals.

For example, suppose the integers from the data stream are 1, 3, 7, 2, 6, ..., then the summary will be:

[1, 1]
[1, 1], [3, 3]
[1, 1], [3, 3], [7, 7]
[1, 3], [7, 7]
[1, 3], [6, 7]

Follow up:
What if there are lots of merges and the number of disjoint intervals are small compared to the data stream's size?


思路: 用一个数组来保存结果, 然后每次搜索的时候用lower_bound可以找到第一个大于等于要插入的值的区间, 当前要插入的值可能会正好等于上个区间的end+1, 因此需要做个判断. 把能合并的区间都从数组中删除, 最后插入一个新的区间.

关于follow-up, 如果合并的操作非常多但是最后区间可能很少, 这种情况下不适合直接用vector, 因为他的合并操作需要移位, 故时间复杂度是O(n), 频繁的移位会造成时间复杂度大大增加. 一个更好的解决办法是使用set, 因为二叉搜索树插入查找都可以在O(log n)完成, 只需要在返回结果的时候将set中的值放到vector中即可.

代码如下:

/**
 * 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 SummaryRanges {
public:
    void addNum(int val) {
        auto Cmp = [](Interval a, Interval b) { return a.start < b.start; };
        auto it = lower_bound(vec.begin(), vec.end(), Interval(val, val), Cmp);
        int start = val, end = val;
        if(it != vec.begin() && (it-1)->end+1 >= val) it--;
        while(it != vec.end() && val+1 >= it->start && val-1 <= it->end)
        {
            start = min(start, it->start);
            end = max(end, it->end);
            it = vec.erase(it);
        }
        vec.insert(it,Interval(start, end));
    }
    
    vector<Interval> getIntervals() {
        return vec;
    }
private:
    vector<Interval> vec;
};

/**
 * Your SummaryRanges object will be instantiated and called as such:
 * SummaryRanges obj = new SummaryRanges();
 * obj.addNum(val);
 * vector<Interval> param_2 = obj.getIntervals();
 */



class SummaryRanges {
public:
    /** Initialize your data structure here. */
    void addNum(int val) {
        auto it = st.lower_bound(Interval(val, val));
        int start = val, end = val;
        if(it != st.begin() && (--it)->end+1 < val) it++;
        while(it != st.end() && val+1 >= it->start && val-1 <= it->end)
        {
            start = min(start, it->start);
            end = max(end, it->end);
            it = st.erase(it);
        }
        st.insert(it,Interval(start, end));
    }
    
    vector<Interval> getIntervals() {
        vector<Interval> result;
        for(auto val: st) result.push_back(val);
        return result;
    }
private:
    struct Cmp{
        bool operator()(Interval a, Interval b) { return a.start < b.start; }
    };
    set<Interval, Cmp> st;
};


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【leetcode】Data Stream as Disjoint Intervals

题目链接:https://leetcode.com/problems/data-stream-as-disjoint-intervals/ Given a data stream input of ...
  • yeqiuzs
  • yeqiuzs
  • 2016年06月01日 21:47
  • 1261

LeetCode 513. Find Bottom Left Tree Value

513. Find Bottom Left Tree Value Given a binary tree, find the leftmost value in the last row of th...
  • liuchuo
  • liuchuo
  • 2017年02月14日 22:44
  • 467

[leetcode]513. Find Bottom Left Tree Value

这道题的要求是寻找最深的一层中最靠左的节点的value。分析一下题目,优先的节点应该是深度最深的节点,只要这个节点的深度大于所有的节点,就算它是某个节点的右边右边右边节点,那么也应该返回这个节点的值。...

LeetCode 352. Data Stream as Disjoint Intervals(数据流区间)

原题网址:https://leetcode.com/problems/data-stream-as-disjoint-intervals/ Given a data stream input...
  • jmspan
  • jmspan
  • 2016年06月16日 01:11
  • 917

352. Data Stream as Disjoint Intervals

352. Data Stream as Disjoint Intervals

[Leetcode] 295. Find Median from Data Stream 解题报告

题目: Median is the middle value in an ordered integer list. If the size of the list is even, the...

Leetcode 435. Non-overlapping Intervals 无交叉覆盖区间 解题报告

1 解题思想题目给了一堆区间[起始位置,结束位置] 这些区间可能会有一些交叠的地方(边界相邻不算),现在要求找到一个方法,可以做最少的删除动作,使得剩下的区间都不交叉覆盖,返回那个需要删除的最少次数...
  • MebiuW
  • MebiuW
  • 2016年11月06日 14:48
  • 1666

【LeetCode】Merge Intervals 解题报告

【LeetCode】Merge Intervals 解题报告标签(空格分隔): LeetCode题目地址:https://leetcode.com/problems/merge-intervals/#...

Leetcode #56. Merge Intervals 间隔合并 解题报告

1 解题思想这道题虽然标记的是Hard,但是我觉得至多Middle的难度吧,题目是给了很多区间,中间可能有重叠,现在就让你将他进行合并。首先对于这个问题,我们肯定要排序!按照什么排序么?,注意到我们是...
  • MebiuW
  • MebiuW
  • 2016年04月26日 23:54
  • 600
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[leetcode] 352. Data Stream as Disjoint Intervals 解题报告
举报原因:
原因补充:

(最多只允许输入30个字)