【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 ...
随机推荐
- 推荐图书-《SQL Server 2008商业智能完美解决方案》
内容简介 <SQL Server 2008商业智能完美解决方案>介绍如何使用Microsoft SQL Server 2008开发商业智能(BI)解决方案.<SQL Server 2 ...
- Android 滑动效果基础篇(三)—— Gallery仿图像集浏览
Android系统自带一个Gallery浏览图片的应用,通过手指拖动时能够非常流畅的显示图片,用户交互和体验都很好. 本示例就是通过Gallery和自定义的View,模仿实现一个仿Gallery图像集 ...
- iOS开发——动画篇Swift篇&炫酷弹出菜单
炫酷弹出菜单 这个是一个第三方按钮菜单组件,原版是使用Objective-C编写的名为AwesomeMenu的组件,地址是:https://github.com/levey/AwesomeMenu ...
- SSH框架之Struts(2)——Struts的执行流程之配置文件
上篇我们大致了解了一下採用了Struts框架的web页面运行流程. 接下来的几篇我们通过Struts的源代码来学习一下Struts的内部原理. 当server启动的时候.server会依据配置文件初始 ...
- PHP实现Web Service(转)
1.OAuth OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码) 2.SCA 服务组件 ...
- replace和insert的语句插入(转)
SELECT INTO 和 INSERT INTO SELECT 两种表复制语句 Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) valu ...
- 修复 MySQL 数据库结构错误 – mysql_upgrade升级
http://www.cnblogs.com/wjoyxt/p/5477072.html 不知道是不是每次更新 MySQL 软件之后都需要执行数据库升级指令?在我进行过的几次软件升级之后,总会在 My ...
- PL/SQL developer 使用技巧汇总
为了快速的使用PL/SQL developer 进行 oracle数据库相关开发,将一些使用频率较高的使用技巧进行汇总如下,以下转自网络和自己的测试 1.切换schema --switch schem ...
- shareplex的安装&&起停服务(添加新用户)
一.主机环境 主从类型 系统版本 数据库版本 主机地址 主机名 源数据库 Centos6.4 X86_64 11.2.0.4.0 192.168.3.230 dbshareplex 目的数据库 C ...
- Oracle常用命令13(数据库的启动、关闭)
数据库的启动.关闭 数据库的启动:安装启动.非安装启动.共享启动.独占启动.约束启动.强制启动 --不登陆的方式进入 Sqlplus /nolog 安装启动: Startup {pfile=<f ...