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  */
  • 相关阅读:
    ecshop学习入门
    php跳转页面代码
    PHP验证登录用户名和密码
    使用self关键字调用类体中的静态成员
    PHP中读取文件的几个方法
    MVC5 Entity Framework学习之更新相关数据
    global.asax文件的应用
    DbSet<TEntity> 类
    IDisposable接口详解
    bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化
  • 原文地址:https://www.cnblogs.com/y119777/p/5878110.html
Copyright © 2011-2022 走看看