文章目录

  • 1. 题目
  • 2. 解题

1. 题目

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

例如,假设数据流中的整数为 1,3,7,2,6,…,每次的总结为:

[1, 1]
[1, 1], [3, 3]
[1, 1], [3, 3], [7, 7]
[1, 3], [7, 7]
[1, 3], [6, 7]

进阶:
如果有很多合并,并且与数据流的大小相比,不相交区间的数量很小,该怎么办?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/data-stream-as-disjoint-intervals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 题目不难,二分查找 + if else 就可以了(看找到的位置前后能否合并),见注释
class SummaryRanges {map<int,int> m; // start, end
public:/** Initialize your data structure here. */SummaryRanges() {}void addNum(int val) {if(m.empty()){m[val] = val;return;}auto it = m.lower_bound(val); // it 的 start >= valif(it != m.end()) // 后面有区间{int start = it->first;int end = it->second;if(start == val)return;else if(start == val+1) // val 可以 跟 it 区间合并{if(it != m.begin()) // it 前面还有区间{it--;int prevStart = it->first;int prevEnd = it->second;if(prevEnd+1 == val) // val 可以跟前面合并{m.erase(start);//删除后面区间m[prevStart] = end;//两个区间合并}else//不能跟前面合并{m.erase(start);m[val] = end;//更新后面的区间}}else//前面没有区间{m.erase(start);m[val] = end;//更新后面的区间}}else // val 不可以 跟 it 区间合并{if(it != m.begin()) // it 前面还有区间{it--;int prevStart = it->first;int prevEnd = it->second;if(prevEnd+1 == val){   // val 可以跟前面合并m[prevStart] = val;}else if(prevEnd+1 < val){   // 前后都不能合并,自己独立m[val] = val;}}else{m[val] = val;}}}else // 后面没有区间{it--;int prevStart = it->first;int prevEnd = it->second;if(prevEnd+1 == val){   // 可以跟前面合并m[prevStart] = val;}else if(prevEnd+1 < val)m[val] = val;//不能合并,独立}}vector<vector<int>> getIntervals() {vector<vector<int>> ans(m.size());int i = 0;for(auto& mi : m){ans[i++] = {mi.first, mi.second};}return ans;}
};

56 ms 29.1 MB C++

题解区还有比较暴力的做法,直接全部插入set,最后顺序整理区间

class SummaryRanges {public:/** Initialize your data structure here. */set<int> ans;SummaryRanges() {}void addNum(int val) {ans.insert(val);}vector<vector<int>> getIntervals() {vector<vector<int>> res;int left = *ans.begin();int right = *ans.begin();for (auto it = ans.begin(); it != ans.end(); it++) {if (*it > right + 1) {res.push_back({left, right});left = *it;}right = *it;}res.push_back({left, right});return res;}
};作者:qia-si-ming-yue-qing-feng
链接:https://leetcode-cn.com/problems/data-stream-as-disjoint-intervals/solution/bao-li-mei-xue-setyong-fa-by-qia-si-ming-yue-qing-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

其时间 96 ms 31.7 MB C++,我的解法稍优一些


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 352. 将数据流变为多个不相交区间(map二分查找)相关推荐

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

    352. 将数据流变为多个不相交区间 给你一个由非负整数 a1, a2, -, an 组成的数据流输入,请你将到目前为止看到的数字总结为不相交的区间列表. 实现 SummaryRanges 类: Su ...

  2. 【数据结构与算法】之深入解析“将数据流变为多个不相交区间”的求解思路与算法示例

    一.题目要求 给你一个由非负整数 a1, a2, -, an 组成的数据流输入,请你将到目前为止看到的数字总结为不相交的区间列表. 实现 SummaryRanges 类: SummaryRanges( ...

  3. leetcode 436. Find Right Interval | 436. 寻找右区间(二分查找不小于某值的第一个位置)

    题目 https://leetcode.com/problems/find-right-interval/ 题解 这题考察点不难,就是个普通的二分查找.详细过程是: 因为 start 是唯一的,所以先 ...

  4. leetcode 分享巧克力 java_LeetCode 1231. 分享巧克力(极小极大化 二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 你有一大块巧克力,它由一些甜度不完全相同的小块组成.我们用数组 sweetness 来表示每一小块的甜度. 你打算和 K 名朋友一起分享这块巧克力,所以你 ...

  5. leetcode 911. Online Election | 911. 在线选举(加强堆 + 二分查找)

    题目 https://leetcode.com/problems/online-election/ 题解 我的解法是,用预计算(加强堆,O(nlogn)) + 二分查找(用的自带TreeMap,查找复 ...

  6. LeetCode 2071. 你可以安排的最多任务数目(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给你 n 个任务和 m 个工人.每个任务需要一定的力量值才能完成,需要的力量值保存在下标从 0 开始的整数数组 tasks 中,第 i 个任务需要 tas ...

  7. LeetCode 1618. 找出适应屏幕的最大字号(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 text.并能够在 宽为 w 高为 h 的屏幕上显示该文本. 字体数组中包含按升序排列的可用字号,您可以从该数组中选择任何字体大小. 您可 ...

  8. LeetCode 1552. 两球之间的磁力(极小极大化 二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 在代号为 C-137 的地球上,Rick 发现如果他将两个球放在他新发明的篮子里,它们之间会形成特殊形式的磁力. Rick 有 n 个空的篮子,第 i 个 ...

  9. LeetCode 4. 寻找两个有序数组的中位数(二分查找,难)

    文章目录 1. 题目 2. 解题 2.1 合并数组 2.2 优化2.1解法,双指针 2.3 二分法(找第k个数) 2.4 切分法 1. 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 n ...

最新文章

  1. Python练习-循环及切片-2018.11.27
  2. 数据库范式解析(1NF 2NF 3NF BCNF)
  3. 解决manjaro更新后pacman: error while loading shared libraries
  4. 了解单片机及单片机的控制原理和 DX516 的用法,控制一个 LED 灯的亮
  5. 学习URLRewriter.dll的使用
  6. 超负荷写代码 = 慢性自杀
  7. 有了这款IDEA插件,再也不需要postman了
  8. SpringBoot与安全
  9. 系统吞吐量评估方法 冯凌圣
  10. Django模板:过滤器
  11. GitHub Actions 部署 VuePress 文档
  12. word转简洁html工具,Convert Word to HTML(Word转HTML工具)
  13. 2021年上半年软件设计师下午真题及答案解析
  14. python修改pdf内容_python3.6调整字体Python处理pdf文件库 - PyPDF2详解
  15. openSUSE:下载帮助
  16. 终极方案 | 梯子(V*n)导致的远程计算机或设备将不接受连接
  17. windows powershell/cmd更改字体
  18. 我为什么还坚持做公众号?(二)
  19. webpack 极简教程(前端自动化构建)
  20. CentOS7.5安装Oracle19c

热门文章

  1. yarn 怎么查看有多个job在跑_flink on yarn 模式下提示yarn资源不足问题分析
  2. excel合并两列内容_还在为合并WPS表格(Excel)中两列内容而犯愁?此方法简单高效...
  3. 塑料封装可靠性问题浅析
  4. 关于无法加载已创建的布局文件的问题的解决方案以及已布局在对应的R文件中未生成相应ID的问题的解决
  5. python wheel使用_Python wheel.Wheel方法代碼示例
  6. #Pragma Pack(n)与内存分配 pragma pack(push,1)与#pragma pack(1)的区别
  7. stm32c语言设计以及注释,13个基于STM32的经典项目设计实例,全套资料~-嵌入式系统-与非网...
  8. php多人点餐可以看到对方点的菜,千万不要小看你身边那个会点菜的人,因为
  9. 软件测试工程师核心竞争力(转)
  10. 游戏大厅 从基础开始(7)--绕回来细说聊天室(中间偏下)之女仆编年史2