[leetcode]352. Data Stream as Disjoint Intervals

数据流合并成区间,每次新来一个数,表示成一个区间,然后在已经保存的区间中进行二分查找,最后结果有3种,插入头部,尾部,中间,插入头部,不管插入哪里,都判断一下左边和右边是否能和当前的数字接起来,我这样提交了,发现错了,想到之前考虑要不要判重,我感觉是这个问题,然后就是在二分查找的时候,判断一下左右区间是否包含当前的值,包含就直接返回。

 1 /**
 2  * Definition for an interval.
 3  * struct Interval {
 4  *     int start;
 5  *     int end;
 6  *     Interval() : start(0), end(0) {}
 7  *     Interval(int s, int e) : start(s), end(e) {}
 8  * };
 9  */
10  bool cmp(Interval a, Interval b) {
11         if(a.start == b.start) return a.end < b.end;
12         return a.start < b.start;
13     }
14 class SummaryRanges {
15 public:
16     /** Initialize your data structure here. */
17    
18     vector<Interval> v;
19     SummaryRanges() {
20         v.clear();
21     }
22     
23     void addNum(int val) {
24         //cout << val << " " << v.size() << endl;
25         Interval d(val, val);
26         if(v.size() == 0) v.push_back(d);
27         else {
28             int t = lower_bound(v.begin(), v.end(), d, cmp) - v.begin();
29             //cout << val << " " << t << endl;
30             if(t == 0) {
31                 if(val == v[0].start) return;
32                 if(v[0].start - 1 == val) {
33                     v[0].start = val;
34                 } else {
35                     v.insert(v.begin() + t, d);
36                 }
37             } else if(t == v.size()) {
38                 if(v[t - 1].end >= val) return;
39                 if(v[t - 1].end + 1 == val) {
40                     v[t - 1].end = val;
41                 } else {
42                     v.push_back(d);
43                 }
44             } else {
45                 if(v[t - 1].start == val || v[t - 1].end >= val || v[t].start == val) return;
46                 if(v[t - 1].end + 2 == v[t].start) {
47                     v[t - 1].end = v[t].end;
48                     v.erase(v.begin() + t);
49                 } else if(v[t - 1].end + 1 == val) {
50                     v[t - 1].end = val;
51                 } else if(v[t].start - 1 == val) {
52                     v[t].start = val;
53                 } else {
54                     v.insert(v.begin() + t, d);
55                 }
56             }
57             
58         }
59     }
60     
61     vector<Interval> getIntervals() {
62         return v;
63     }
64 };
65 
66 /**
67  * Your SummaryRanges object will be instantiated and called as such:
68  * SummaryRanges obj = new SummaryRanges();
69  * obj.addNum(val);
70  * vector<Interval> param_2 = obj.getIntervals();
71  */
原文地址:https://www.cnblogs.com/y119777/p/5878110.html