问题描述:

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中。 具体代码:
 public class SummaryRanges {

     List<Interval> lists;
/** Initialize your data structure here. */
public SummaryRanges() {
lists=new ArrayList<Interval>(); } public void addNum(int val) {
if(lists.size()==0){
Interval p = new Interval(val,val);
lists.add(p);
return;
}
if(lists.size()==1){
if(lists.get(0).end <val){
Interval p=lists.remove(0);
if(p.end==val-1){
Interval p1=new Interval(p.start,val);
lists.add(p1);
return;
}
Interval p1=new Interval(val,val);
lists.add(p);
lists.add(p1); return;
}
else if(lists.get(0).start >val){
Interval p=lists.remove(0);
if(p.start==val+1){
Interval p1=new Interval(val,p.start);
lists.add(p1); return;
}
Interval p1=new Interval(val,val);
lists.add(p1);
lists.add(p); return;
}
else{
return;
}
}
int pos=findIndex(val);
if(pos==-1){
if(val==lists.get(0).start-1){
lists.get(0).start=val;
return;
}
else{
Interval p1=new Interval(val,val);
lists.add(0, p1);
return;
}
}
if(pos==lists.size()-1){
if(val<=lists.get(pos).end){
return;
}
else{
if(val==lists.get(pos).end+1){
lists.get(pos).end=val;
return;
}
else{
Interval p1=new Interval(val,val);
lists.add(p1); return;
}
}
} if(val<=lists.get(pos).end){
return;
}
else if(val==lists.get(pos+1).start-1 && val==lists.get(pos).end+1){
Interval p1=lists.remove(pos);
Interval p2=lists.remove(pos);
Interval p=new Interval(p1.start, p2.end); lists.add(pos, p);
return;
}
else if(val==lists.get(pos+1).start-1){
lists.get(pos+1).start=val;
return;
}
else if(val==lists.get(pos).end+1){
lists.get(pos).end=val;
return;
}
else{
Interval p=new Interval(val, val);
lists.add(pos+1, p); return;
} } public List<Interval> getIntervals() {
return lists;
} private int findIndex(int val){
int start=0;
int end=lists.size()-1;
if(lists.get(0).start>val)
return -1;
if(lists.get(lists.size()-1).start<val)
return lists.size()-1;
while(start<end){
int mid=(start+end)/2;
if(val<lists.get(mid).start){
end=mid-1;
}
else if(val>lists.get(mid).start){
if(val<lists.get(mid+1).start)
return mid;
else
start= mid+1;
}
else
return mid;
}
return start;
}
}
步骤可能有些繁琐,以后有时间会继续优化代码。

【leetcode】352. Data Stream as Disjoint Intervals的更多相关文章

  1. [LeetCode] 352. Data Stream as Disjoint Intervals 分离区间的数据流

    Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...

  2. leetcode@ [352] Data Stream as Disjoint Intervals (Binary Search & TreeSet)

    https://leetcode.com/problems/data-stream-as-disjoint-intervals/ Given a data stream input of non-ne ...

  3. 352. Data Stream as Disjoint Intervals

    Plz take my miserable life T T. 和57 insert interval一样的,只不过insert好多. 可以直接用57的做法一个一个加,然后如果数据大的话,要用tree ...

  4. 352. Data Stream as Disjoint Intervals (TreeMap, lambda, heapq)

    Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...

  5. [leetcode]352. Data Stream as Disjoint Intervals

    数据流合并成区间,每次新来一个数,表示成一个区间,然后在已经保存的区间中进行二分查找,最后结果有3种,插入头部,尾部,中间,插入头部,不管插入哪里,都判断一下左边和右边是否能和当前的数字接起来,我这样 ...

  6. 【LeetCode】915. Partition Array into Disjoint Intervals 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/partitio ...

  7. 【leetcode】915. Partition Array into Disjoint Intervals

    题目如下: 解题思路:题目要求的是在数组中找到一个下标最小的index,使得index左边(包括自己)子序列的最大值小于或者等于右边序列的最小值.那么我们可以先把数组从最左边开始到数组最右边所有子序列 ...

  8. 352[LeetCode] Data Stream as Disjoint Intervals

    Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...

  9. [LeetCode] Data Stream as Disjoint Intervals 分离区间的数据流

    Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...

随机推荐

  1. Educational Codeforces Round 1 A. Tricky Sum 暴力

    A. Tricky Sum Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/598/problem ...

  2. Codeforces Gym 100286G Giant Screen 水题

    Problem G.Giant ScreenTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/con ...

  3. Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉

    Problem H. Hard TestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...

  4. httpclient发送request请求时设置header和timeout

    package com.xxx.xxx.common; import java.io.BufferedReader; import java.io.InputStreamReader; import ...

  5. Java多线程模式(二)

    Guarded Suspension Pattern      该模式描述的是当一个线程在执行某个操作时,但由于其他资源还没有准备好,需要等待,那么就等待资源准备好才开始自己的操作.我们直接看代码例子 ...

  6. 解决IE下jquery ajax无法获得最新数据的问题(IE缓存)

    今天修改一个bug,利用ajax查询数据,在谷歌浏览器下可以获取到最新数据,而在IE中获得是旧数据,无法获得最新的数据,经查资料,才发现时IE缓存再作怪. 发现此ajax请求用的get方式,每次请求的 ...

  7. 中兴电信光纤猫F612管理员密码获取方法

    1.telnet 192.168.1.1 账号:root 密码:Zte521 2.输入命令: sendcmd 1 DB p DevAuthInfo 得到管理员账号密码如下: <DM name=& ...

  8. BootStrap2学习日记3--响应式布局实用类

    BootStrap2中常用的响应式布局类如: visible-phone     仅在 手机平台显示 visible-tablet      仅在 平板电脑显示 visible-desktop   仅 ...

  9. css笔记16:盒子模型的入门案例

    1.案例一: 效果图如下: (1)box1.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&quo ...

  10. DHCP服务详解

    DHCP概念和原理 dhcp服务作用 为大量客户机自动分配地址,提供集中管理 减轻管理和维护成本,提高网络配置效率 可分配的地址信息主要包括: 网卡的IP地址.子网掩码 对应的网络地址 默认网关地址 ...