LeetCode352 将数据流变为多个不相交区间

1 题目

给你一个由非负整数 a1, a2, ..., an 组成的数据流输入,请你将到目前为止看到的数字总结为不相交的区间列表。

实现 SummaryRanges 类:

  • SummaryRanges() 使用一个空数据流初始化对象。
  • void addNum(int val) 向数据流中加入整数 val 。
  • int[][] getIntervals() 以不相交区间 [starti, endi] 的列表形式返回对数据流中整数的总结

2 思路

对于一组数据,

1 2 3 5 7 8

将连续的数字归纳到一个区间内,因此该数组的表示为[[1,3][5,5][7,8]]

方法1:列表+二分查找

使用一个数组存储维护所有的不相交区间,当有新元素添加时,通过二分查找的方式找到添加的位置,

  • 如果在区间内,例如[1,3]中添加2,此时2元素已经存在。则直接跳过,
  • 如果不在区间内,当添加的元素在区间的左右边界时,则需要考虑是否存在合并区间的情况。
    • 当元素正好是上一个区间的右边界+1,且是下一个区间的的左边界-1,此时需要合并区间,例如[0,0][2,3],添加1,此时合并区间为[0,3]
    • 当元素正好是上一个区间的右边界+1,或者是下一个区间的的左边界-1,更新区间的左右边界即可
    • 当元素不满足以上情况,则单独成为一个区间[1,1][5,5]添加3后为[1,1][3,3][5,5]

方法2:并查集

使用一个10000长度的数组parent模拟该区间,数组内存储该元素父元素的之,初始化时,每个元素单独成区间。

使用一个set集合存储出现过的元素

为集合建立并查集,集合的父亲代表连通集的右边界

每次获取区间进行一次并查集的查询操作,相邻的区间会被合并,遍历每个出现过的元素(从小到大排序),

  • 如果元素小于结果集的尾值,则意味着该元素已经包含在结果集中,直接跳过,
  • 如果小于尾值,则需要以该元素为左边界建立区间,然后根据parent数组查询右边界即可

3 Code

import bisect
class SummaryRanges:
def __init__(self):
#模拟区间
self.p=[i for i in range(100005)]
#存储出现过的元素
self.nums=[] def addNum(self, val: int) -> None:
if val not in self.nums:
#保证插入后数组是有序的
bisect.insort(self.nums,val)
#该元素的右边界是它下一个元素的右边界
self.p[val]=self.p[val+1] def parent(self,num):
#单独成区间,直接返回该元素
if num==self.p[num]:
return num
#递归查找父元素
self.p[num]=self.parent(self.p[num])
return self.p[num] def getIntervals(self) -> List[List[int]]:
res=[]
#遍历每个元素
for i in range(len(self.nums)):
#大于结果集尾值则跳过
if len(res)!=0 and res[-1][1]>=self.nums[i]:
continue
#将左右边界插入
res.append([self.nums[i],self.parent(self.nums[i])-1])
return res

LeetCode352 将数据流变为多个不相交区间的更多相关文章

  1. Java实现 LeetCode 352 将数据流变为多个不相交区间

    352. 将数据流变为多个不相交区间 给定一个非负整数的数据流输入 a1,a2,-,an,-,将到目前为止看到的数字总结为不相交的区间列表. 例如,假设数据流中的整数为 1,3,7,2,6,-,每次的 ...

  2. [Swift]LeetCode352. 将数据流变为多个不相交间隔 | Data Stream as Disjoint Intervals

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

  3. HDU 2037 - 今年暑假不AC - [经典 选择不相交区间 问题]

    是一道很经典的选择不相交区间的问题. 关于选择不相交区间,可以参考刘汝佳.也可以参考:http://blog.csdn.net/dgq8211/article/details/7534488 以及模板 ...

  4. Codeforces Round #384 (Div. 2) A B C D dfs序+求两个不相交区间 最大权值和

    A. Vladik and flights time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  5. 区间不相交&区间覆盖

    //code by virtualtan 2018 寒7 区间不相交 #include <cstdio> #include <algorithm> #define MAXN 1 ...

  6. AcWing 908. 最大不相交区间数量

    //1.将每个区间按右端点从小到大排序 //2.从前往后依次枚举每个区间,如果当前区间中已经包含点,就直接跳过,否则,选择当前区间的右端点 //选右端点的话,可以尽可能的包含在多个区间里 //那么选的 ...

  7. 洛谷 P1803 凌乱的yyy【经典贪心/选择不相交区间】

    题目背景 快noip了,yyy很紧张! 题目描述 现在各大oj上有n个比赛,每个比赛的开始.结束的时间点是知道的. yyy认为,参加越多的比赛,noip就能考的越好(假的) 所以,他想知道他最多能参加 ...

  8. (选择不相交区间)今年暑假不AC hdu2037

    今年暑假不AC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  9. LeetCode刷题总结-二分查找和贪心法篇

    本文介绍LeetCode上有关二分查找和贪心法的算法题,推荐刷题总数为16道.具体考点归纳如下: 一.二分查找 1.数学问题 题号:29. 两数相除,难度中等 题号:668. 乘法表中第k小的数,难度 ...

随机推荐

  1. 你知道 JavaScript 中的 Arguments 对象都有哪些用途吗?

    JavaScript 中 Arguments 对象的用途总结. 前言 相信我们很多人在代码开发的过程中都使用到过一个特殊的对象 -- Arguments 对象. 在实际开发中,Arguments 对象 ...

  2. 理解Java中对象基础Object类

    一.Object简述 源码注释:Object类是所有类层级关系的Root节点,作为所有类的超类,包括数组也实现了该类的方法,注意这里说的很明确,指类层面. 所以在Java中有一句常说的话,一切皆对象, ...

  3. Shell脚本基础及基本常用命令

    1.概述 脚本语言(shell.python):解释性语言,用解释器解释 运行效率低 | c.java:描述性语言,运行效率高 以.sh结尾会有高亮显示 执行: sh hello.sh 或者 chmo ...

  4. Django使用tinymce富文本编辑器

    1 - 安装 pip install django-tinymce==2.6.0 2 - 注册app INSTALLED_APPS = ( ... 'tinymce', ) 3 - 在setting中 ...

  5. C# 给PPT中的图表添加趋势线

    本文内容分享通过C#程序代码给PPT文档中的图表添加数据趋势线的方法. 支持趋势线的图表类型包括二维面积图.条形图.柱形图.柱形图.股价图.xy (散点图) 和气泡图中:不能向三维.堆积.雷达图.饼图 ...

  6. 板子题 Sol

    RT Cyber_Tree 出了一道板子题... 这题乍看之下貌似还不戳,但如果您做过类似的题,那么这就是一道板子题.... 首先明确要求的是什么,如果我们只考虑权值最大而不考虑最小距离,那么要求的显 ...

  7. 记一次《C语言踩内存》问题定位有感

    踩内存问题,个人认为算是比较容易出现但是有很难定位的问题,被踩者轻者功能瘫痪,重者一命呜呼,直接诱发死机.产生踩内存的的原因也比较多样,比较典型的有如下几种: 数组越界访问 字符串越界操作 直接操作野 ...

  8. 10 个不为人知的Python冷知识

    1. 省略号也是对象 ... 这是省略号,在Python中,一切皆对象.它也不例外. 在 Python 中,它叫做 Ellipsis . 在 Python 3 中你可以直接写-来得到这玩意. > ...

  9. php获取纳秒方法

    PHP不提供精度高于微秒的函数. 可以使用system功能,直接从机器中获得的价值,如果你运行的是Linux: $nanotime = system('date +%s%N');

  10. 环形链表II

    题目描述: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 p ...