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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

352. Data Stream as Disjoint Intervals

發布時間:2024/10/12 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 352. Data Stream as Disjoint Intervals 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:?https://leetcode.com/problems/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.

For example, suppose the integers from the data stream are 1, 3, 7, 2, 6, ..., then the summary will be:

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

Follow up:
What if there are lots of merges and the number of disjoint intervals are small compared to the data stream's size?

?

解析:

題目的意思是新加進來的數字如果遇到連續區間就合并

方法一用vector

/*** Definition for an interval.* struct Interval {* int start;* int end;* Interval() : start(0), end(0) {}* Interval(int s, int e) : start(s), end(e) {}* };*/ class SummaryRanges { public:void addNum(int val) {auto Cmp = [](Interval a, Interval b) { return a.start < b.start; };  auto it = lower_bound(vec.begin(), vec.end(), Interval(val, val), Cmp);int start = val, end = val;if(it != vec.begin() && (it-1)->end+1 >= val) it--;while(it != vec.end() && val+1 >= it->start && val-1 <= it->end){start = min(start, it->start);end = max(end, it->end);it = vec.erase(it);}vec.insert(it,Interval(start, end));}vector<Interval> getIntervals() {return vec;} private:vector<Interval> vec; };/*** Your SummaryRanges object will be instantiated and called as such:* SummaryRanges obj = new SummaryRanges();* obj.addNum(val);* vector<Interval> param_2 = obj.getIntervals();*/

注意:

auto Cmp = [](Interval a, Interval b) { return a.start < b.start; };

這里實際上用的是一個lambda表達式

?

auto it = lower_bound(vec.begin(), vec.end(), Interval(val, val), Cmp);

這樣代碼用了C11中的auto,根據初始化的值的類型來推斷變量類型的功能,這里it的類型實際上是vector<Interval>::iterator

?

?

?

方法二用set

/*** Definition for an interval.* struct Interval {* int start;* int end;* Interval() : start(0), end(0) {}* Interval(int s, int e) : start(s), end(e) {}* };*/ class SummaryRanges { public:void addNum(int val) {auto Cmp = [](Interval a, Interval b) { return a.start < b.start; };auto it = lower_bound(vec.begin(), vec.end(), Interval(val, val), Cmp);int start = val, end = val;if(it != vec.begin() && (it-1)->end+1 >= val) it--;while(it != vec.end() && val+1 >= it->start && val-1 <= it->end){start = min(start, it->start);end = max(end, it->end);it = vec.erase(it);}vec.insert(it,Interval(start, end));}vector<Interval> getIntervals() {return vec;} private:vector<Interval> vec; };/*** Your SummaryRanges object will be instantiated and called as such:* SummaryRanges obj = new SummaryRanges();* obj.addNum(val);* vector<Interval> param_2 = obj.getIntervals();*/

?

?

轉載于:https://www.cnblogs.com/raichen/p/5605472.html

總結

以上是生活随笔為你收集整理的352. Data Stream as Disjoint Intervals的全部內容,希望文章能夠幫你解決所遇到的問題。

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