zoukankan      html  css  js  c++  java
  • [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  */
  • 相关阅读:
    备忘: Visual Studio 2013 VC++ IDE 使用小贴示。
    获取动态数组指针 所指向数组长度的一种方法
    备忘:C++ 类 (初学之实录)。
    备忘:VC++ 中的异常处理
    备忘: C++中的 vector 容器
    备忘:C++基础 -- 数据类型的学习总结
    Windws Server 2008 R2 WEB环境配置之MYSQL 5.6.22安装配置
    Windows Server 2008 R2 WEB服务器配置系列文章索引
    php学习过程二
    php学习过程一
  • 原文地址:https://www.cnblogs.com/y119777/p/5878110.html
Copyright © 2011-2022 走看看