• 【leetcode】352. 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.

    解题思路:

    这道题是目前最新的题,其实思路很容易找到,难点在于考虑到所有的可能的情形。

    首先要确定类必须有一个保存当前结果的集合类List<Interval>,其元素的按Interval的起始值的大小排序,当调用getIntervals()时直接返回该lists,当调用addNum(val)类时会对List<Interval>中的类进行调整。具体调整步骤如下:

    1)调用自定义的findIndex(int val)方法找到Interval起始值小于val的最大的Interval的值。具体查找过程可以用二分查找的方法。这里需要考虑两个特殊情况:val值比位置为0的Interval的起始值还小;或者比最后一个Interval的起始值还大。这两个情况可以做特殊处理(分别返回-1,和lists.size()-1)。

    2)针对返回值考虑如下情况(直接举具体的例子,相信大家都可以理解):

        若返回值是-1: 

       a.若当前值为1,位置为0的Interval值为(2,x),可以修改这个Interval为(1,x);

       b.若当前值为1,位置为0的Interval值为(3,x),可以新建一个Interval(1,1),加入lists中。

        若返回值是lists.size()-1:

      a.若当前值为11,最后一个Interval是(8,11),不做修改;

      b.若当前值为11,最后一个Intever是(8,10),需要将它改为(8,11);

      c.若当前值为11,最后一个Intever是(8,9),需要新建一个(11,11),加入lists中。

    若返回值pos在[0,lists.size()-1);
    a.如果val==lists.get(pos+1).start-1 && val==lists.get(pos).end+1:需要将两个Interval合并成一个新的Interval;
    b.如果val==lists.get(pos+1).start-1 && val!=lists.get(pos).end+1:需要修改lists[pos+1]的值;
    c.如果val!=lists.get(pos+1).start-1 && val==lists.get(pos).end+1需要修改lists[pos]的值;
    d.其他情况:新建一个Interval:(val,val)并加入到lists中。

    具体代码:
      1 public class SummaryRanges {
      2     
      3     List<Interval> lists;
      4     /** Initialize your data structure here. */
      5     public SummaryRanges() {
      6         lists=new ArrayList<Interval>();
      7         
      8     }
      9     
     10    public void addNum(int val) {
     11         if(lists.size()==0){
     12             Interval p = new Interval(val,val);
     13             lists.add(p);
     14             return;
     15         }
     16         if(lists.size()==1){
     17             if(lists.get(0).end <val){
     18                 Interval p=lists.remove(0);
     19                 if(p.end==val-1){
     20                     Interval p1=new Interval(p.start,val);
     21                     lists.add(p1);
     22                     return;
     23                 }
     24                 Interval p1=new Interval(val,val);
     25                 lists.add(p);
     26                 lists.add(p1);
     27                 
     28                 return;
     29             }
     30             else if(lists.get(0).start >val){
     31                 Interval p=lists.remove(0);
     32                 if(p.start==val+1){
     33                     Interval p1=new Interval(val,p.start);
     34                     lists.add(p1);
     35  
     36                     return;
     37                 }
     38                 Interval p1=new Interval(val,val);
     39                 lists.add(p1);
     40                 lists.add(p);
     41                 
     42                 return;
     43             }
     44             else{
     45                 return;
     46             }
     47         }
     48         int pos=findIndex(val);
     49         if(pos==-1){
     50             if(val==lists.get(0).start-1){
     51                 lists.get(0).start=val;
     52                 return;
     53             }
     54             else{
     55                 Interval p1=new Interval(val,val);
     56                 lists.add(0, p1);
     57                 return;
     58             }
     59         }
     60         if(pos==lists.size()-1){
     61             if(val<=lists.get(pos).end){
     62                 return;
     63             }
     64             else{
     65                 if(val==lists.get(pos).end+1){
     66                     lists.get(pos).end=val;
     67                     return;
     68                 }
     69                 else{
     70                     Interval p1=new Interval(val,val);
     71                     lists.add(p1);
     72                     
     73                     return;
     74                 }
     75             }
     76         }
     77         
     78         if(val<=lists.get(pos).end){
     79             return;
     80         }
     81         else if(val==lists.get(pos+1).start-1 && val==lists.get(pos).end+1){
     82             Interval p1=lists.remove(pos);
     83             Interval p2=lists.remove(pos);
     84             Interval p=new Interval(p1.start, p2.end);
     85         
     86             lists.add(pos, p);
     87             return;
     88         }
     89         else if(val==lists.get(pos+1).start-1){
     90             lists.get(pos+1).start=val;
     91             return;
     92         }
     93         else if(val==lists.get(pos).end+1){
     94             lists.get(pos).end=val;
     95             return;
     96         }
     97         else{
     98             Interval p=new Interval(val, val);
     99             lists.add(pos+1, p);
    100             
    101             return;
    102         }
    103         
    104     }
    105     
    106     public List<Interval> getIntervals() {
    107         return lists;
    108     }
    109     
    110     private int findIndex(int val){
    111         int start=0;
    112         int end=lists.size()-1;
    113         if(lists.get(0).start>val)
    114             return -1;
    115         if(lists.get(lists.size()-1).start<val)
    116             return lists.size()-1;
    117         while(start<end){
    118             int mid=(start+end)/2;
    119             if(val<lists.get(mid).start){
    120                 end=mid-1;
    121             }
    122             else if(val>lists.get(mid).start){
    123                 if(val<lists.get(mid+1).start)
    124                     return mid;
    125                 else
    126                     start= mid+1;
    127             }
    128             else
    129                 return mid;
    130         }
    131         return start;
    132     }
    133 }
    步骤可能有些繁琐,以后有时间会继续优化代码。
  • 相关阅读:
    ASP.NET AJAX Sys未定义的解决方法
    幽默中的人生哲理
    我们总是试图抹去一些东西,比如记忆。然而,一切只是徒然。
    在webbrowser中操作js弹出的对话框 以及触发其它事件····
    Asp.Net :写入 、读取 、 删除、追加cookie数组?
    揭开ASP.NET中Cookie编程的奥秘
    多线程调度例子·····················
    winform编程——做过ini配置文件创建文件、添加配置项,修改配置项,删除配置项
    C# 比较二个时间差。Environment.TickCount
     WebBrowser控件捕捉DHTML事件
  • 原文地址:https://www.cnblogs.com/godlei/p/5560204.html
Copyright © 2020-2023  润新知