LeetCode352 将数据流变为多个不相交区间
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 将数据流变为多个不相交区间的更多相关文章
- Java实现 LeetCode 352 将数据流变为多个不相交区间
		
352. 将数据流变为多个不相交区间 给定一个非负整数的数据流输入 a1,a2,-,an,-,将到目前为止看到的数字总结为不相交的区间列表. 例如,假设数据流中的整数为 1,3,7,2,6,-,每次的 ...
 - [Swift]LeetCode352. 将数据流变为多个不相交间隔 | Data Stream as Disjoint Intervals
		
Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...
 - HDU 2037 - 今年暑假不AC - [经典 选择不相交区间 问题]
		
是一道很经典的选择不相交区间的问题. 关于选择不相交区间,可以参考刘汝佳.也可以参考:http://blog.csdn.net/dgq8211/article/details/7534488 以及模板 ...
 - 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 ...
 - 区间不相交&区间覆盖
		
//code by virtualtan 2018 寒7 区间不相交 #include <cstdio> #include <algorithm> #define MAXN 1 ...
 - AcWing 908. 最大不相交区间数量
		
//1.将每个区间按右端点从小到大排序 //2.从前往后依次枚举每个区间,如果当前区间中已经包含点,就直接跳过,否则,选择当前区间的右端点 //选右端点的话,可以尽可能的包含在多个区间里 //那么选的 ...
 - 洛谷 P1803 凌乱的yyy【经典贪心/选择不相交区间】
		
题目背景 快noip了,yyy很紧张! 题目描述 现在各大oj上有n个比赛,每个比赛的开始.结束的时间点是知道的. yyy认为,参加越多的比赛,noip就能考的越好(假的) 所以,他想知道他最多能参加 ...
 - (选择不相交区间)今年暑假不AC hdu2037
		
今年暑假不AC Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
 - LeetCode刷题总结-二分查找和贪心法篇
		
本文介绍LeetCode上有关二分查找和贪心法的算法题,推荐刷题总数为16道.具体考点归纳如下: 一.二分查找 1.数学问题 题号:29. 两数相除,难度中等 题号:668. 乘法表中第k小的数,难度 ...
 
随机推荐
- IMO 2021 第 1 题拓展问题的两个极值的编程求解
			
IMO 2021 第 1 题拓展问题的两个极值的编程求解 本篇是 IMO 2021 第一题题解及相关拓展问题分析 的续篇. 拓展问题三: (I). 求 n 的最小值,使得 n, n + 1, ..., ...
 - C# ThreadPool 分批处理数据,所有数据执行完再返回
			
这是一个调用翻译数据的功能,所有数据一次性提交会造成后台服务压力大,接口反应时间也长. 所以做了一个分批处理,等待所有批次的数据调用接口都返回后再执行下一步. 1 /// <summary> ...
 - java 线程状态 详解
			
线程被创建后,有一个生命周期,下图是线程的生命周期详解. java api java.lang.Thread.State 这个枚举中给出了六种线程状态,分别是: 线程状态 导致状态发生条件 NEW(新 ...
 - netfilter框架之hook点
			
1. Netfilter中hook的所在位置 当网络上有数据包到来时,由驱动程序将数据包从网卡内存区通过DMA转移到设备主存区(内存区), 之后触发中断通知CPU进行异步响应,之后ip_rcv函数会被 ...
 - element后端管理布局
			
<template> <el-container> <el-header> <Header></Header> <span class ...
 - CSS004. 自定义滚动条样式(webkit)
			
CSS /* 滚动条宽度 */ ::-webkit-scrollbar { width: 6px; } /* 轨道样式 */ ::-webkit-scrollbar-track { backgroun ...
 - Sonarqube C# 配置资料整理
			
c#配置方式: http://www.cnblogs.com/CoderAyu/p/9416376.html http://www.cnblogs.com/jingridong/p/6513884.h ...
 - 浅谈 Xamarin Community Toolkit 的未来发展
			
.NET MAUI会在今年晚些时候发布,我们也很高兴和大家一起分享我们对Xamarin Community Toolkit的计划! 这包括 .NET MAUI Community Toolkit.Xa ...
 - Ubuntu 引导修复
			
Ubuntu 引导修复 前言 最近还在看 Docker 的教程,看到了"跨宿主机网络通信"的一节,于是想到去 Ubuntu 中 实践一番.结果发现 Ubuntu 进不去了.由于考虑 ...
 - C语言中的符号重载
			
摘自<C专家编程>第二章37页 C语言中符号的重载 符号 意义 static 在函数内部,表示该变量的值在各个调用间一直保持延续性在函数这一级,表示 ...