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  */
  • 相关阅读:
    Spring MVC全局异常后返回JSON异常数据
    spring mvc 异常统一处理方式
    Duplicate fragment name ERROR Jetty Maven Plugin
    Android中自己定义组件和它的属性
    stl非变易算法(二)
    unix more命令
    g711u与g729比較编码格式
    MD5的加密和解密(总结)
    js 定义类对象
    润乾报表实现可反复分组报表及改进
  • 原文地址:https://www.cnblogs.com/y119777/p/5878110.html
Copyright © 2011-2022 走看看