日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/7/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 352. 将数据流变为多个不相交区间(map二分查找) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 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二分查找)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。