[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;
};


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

leecode 解题总结:352. Data Stream as Disjoint Intervals

#include #include #include #include #include #include using namespace std; /* 问题: Given a data...
  • qingyuanluofeng
  • qingyuanluofeng
  • 2017年03月02日 11:15
  • 211

【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
  • 1365

Data Stream as Disjoint Intervals

插入的新值有三种情况: 1、可以和右边合并 2、可以和左边合并 3、既不能和右边合并也不能和左边合并 class SummaryRanges { private: map m; public...
  • popvip44
  • popvip44
  • 2016年11月13日 10:46
  • 82

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

题目链接: https://leetcode.com/problems/data-stream-as-disjoint-intervals/ Given a data stream input o...
  • qq508618087
  • qq508618087
  • 2016年06月01日 07:24
  • 4664

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

题目: Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the nu...
  • magicbean2
  • magicbean2
  • 2017年08月12日 20:39
  • 110

352. Data Stream as Disjoint Intervals

Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen...
  • wdlsjdl2
  • wdlsjdl2
  • 2016年07月14日 22:40
  • 259

[LeetCode]352. Data Stream as Disjoint Intervals

https://leetcode.com/problems/data-stream-as-disjoint-intervals/?tab=Description 合并数据流中当前插入的数 ...
  • gqk289
  • gqk289
  • 2017年03月06日 15:07
  • 154

[leetcode-352]Data Stream as Disjoint Intervals(java)

思路:采用一个TreeMap的数据结构,因为TreeMap内部是红黑树的数据结构,整体是有序的,而且还可以很快的搜索到大于某个元素的项及小于某个元素的项。 但是不清楚为什么,我代码提交后一直提示Me...
  • zdavb
  • zdavb
  • 2016年07月05日 12:42
  • 651

leetcode 352. Data Stream as Disjoint Intervals

Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers see...
  • huanghanqian
  • huanghanqian
  • 2017年08月08日 18:21
  • 111

[leetcode]352. Data Stream as Disjoint Intervals

题目链接:https://leetcode.com/problems/data-stream-as-disjoint-intervals/description/ Given a data ...
  • xiaocong1990
  • xiaocong1990
  • 2017年08月11日 20:04
  • 58
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[leetcode] 352. Data Stream as Disjoint Intervals 解题报告
举报原因:
原因补充:

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