【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 ...
随机推荐
- HTTP Post Request using Apache Commons
Demonstrates an HTTP Post using the Apache Commons HTTP library. Required Libraries: httpcore-4.1.ja ...
- 极限编程(XP)基本原则与规范
1. 坐在一起(Sitting Together) 尽可能让团队成员坐在一起,Kent Block在一次芝加哥的某个濒临困境的项目中发现,虽然这个团队都是由程序 精英组成,但是却陷入困境,后来他发现, ...
- material-dialogs
https://github.com/afollestad/material-dialogs
- JUnit---Java单元测试必备工具
在我们每天业务代码都写不完,为什么还要写测试代码呢,项目完成之后我再测不行吗? 看起来像是增加了代码量,但是它恰恰帮你减少了后期测试排错的时间,每个team,每个人都是有Bug指标的,首先,每次你 ...
- android152 笔记 4
42. Android中Task任务栈的分配. 首先我们来看下Task的定义,Google是这样定义Task的:a task is what the user experiences as an &q ...
- 优秀js插件收藏
1. 滚动视差效果,类似锤子主页等效果实现 https://github.com/hahnzhu/parallax.js 2. jQuery全屏滚动插件 http://www.dowebok.com/ ...
- graylog2+syslog-ng+mongodb构建集中管理日志服务器 --转载
原文地址:http://blog.chinaunix.net/uid-11065483-id-3654882.html 由于公司内需要监控QQ的上下线记录,原本使用了分光+Panabit+Splunk ...
- 小白日记19:kali渗透测试之选择和修改EXP
EXP 目的:学会选择和修改网上公开的漏洞利用代码[EXP(python\perl\ruby\c\c++....)] 方法: 1.Exploit-db[kali官方维护的漏洞利用代码库] 2.Secu ...
- 普通字符串与Hex编码字符串之间转换
import java.io.UnsupportedEncodingException; import org.apache.commons.codec.binary.Hex; public clas ...
- SRM 584 第一次玩TopCoder。。。只水题一道。。。
第一次topcoder,以前老感觉没有资格去做tc,cf什么的,现在已经慢慢接触了. 感觉还可以,还是有让我们这些蒻菜安慰的水题. tc的确很好玩,用客户端比赛,还有各种规则,而且还是只编写一个类提交 ...