【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中。 具体代码:
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的更多相关文章
- [LeetCode] 352. Data Stream as Disjoint Intervals 分离区间的数据流
Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...
- 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 ...
- 352. Data Stream as Disjoint Intervals
Plz take my miserable life T T. 和57 insert interval一样的,只不过insert好多. 可以直接用57的做法一个一个加,然后如果数据大的话,要用tree ...
- 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 ...
- [leetcode]352. Data Stream as Disjoint Intervals
数据流合并成区间,每次新来一个数,表示成一个区间,然后在已经保存的区间中进行二分查找,最后结果有3种,插入头部,尾部,中间,插入头部,不管插入哪里,都判断一下左边和右边是否能和当前的数字接起来,我这样 ...
- 【LeetCode】915. Partition Array into Disjoint Intervals 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/partitio ...
- 【leetcode】915. Partition Array into Disjoint Intervals
题目如下: 解题思路:题目要求的是在数组中找到一个下标最小的index,使得index左边(包括自己)子序列的最大值小于或者等于右边序列的最小值.那么我们可以先把数组从最左边开始到数组最右边所有子序列 ...
- 352[LeetCode] Data Stream as Disjoint Intervals
Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...
- [LeetCode] Data Stream as Disjoint Intervals 分离区间的数据流
Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...
随机推荐
- 【M15】了解异常处理(exception handling)的成本
1.为了在运行期处理异常,程序必须做大量额外的工作.比如,即使抛出异常,也必须保证离开作用域的栈上对象执行析构方法.因此,必须记录try语句的进入点和离开点,记录catch语句能够处理的异常等.这就意 ...
- 2015 NOIP day1 t1 神奇的幻方 模拟
神奇的幻方 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.luogu.org/problem/show?pid=2615 Descri ...
- C++ AppendMenu
主题 1. 系统菜单下面添加自定义菜单 2. 3. 4. 5. AppendMenu The AppendMenu function appends a new item to th ...
- SSL连接建立过程分析(1)
Https协议:SSL建立过程分析 web訪问的两种方式: http协议,我们普通情况下是通过它訪问web,由于它不要求太多的安全机制,使用起来也简单,非常多web网站也仅仅支持这样的方式下的訪问. ...
- Cisco(思科)路由器静态路由的配置
实验拓扑 实验步骤 我们要使得 1.1.1.0/24.2.2.2.0/24.3.3.3.0/24 网络之间能够互相通信. (1) 步骤 1:在各路由器上配置 IP 地址.保证直连链路的连通性 R1( ...
- debian的备份与还原
不管是windows还是linux 备份都很重要 因为配好一个系统是要花很多时间的 出了问题的话 有备份直接还原就可以了 windows下有ghost 那么linux下呢?Linux可以在系统正在运行 ...
- 跳表SkipList
原文:http://www.cnblogs.com/xuqiang/archive/2011/05/22/2053516.html 跳表SkipList 1.聊一聊跳表作者的其人其事 2. 言归正 ...
- QQWry.dat 数据写入
纯真IP库 数据多,更新及时,很多同学在用,网上关于其读取的帖子也有不少(当然其中有一些是有BUG的),但却很少有关于其写入的帖子.OK,下面分享下写QQWry.dat. QQWry.dat 分三个部 ...
- Scala中的构造器
Scala中的构造器 Scala中的构造器分为两类,主构造器和辅助构造器 主构造器是通过类名后面跟的括号里加参数列表来定义 辅助构造器是通过关键字this定义 定义一个无参主构造器 class rec ...
- ie6双边距bug及其解决办法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...