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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

每天一道LeetCode-----将间隔集中有重叠的间隔合并

發布時間:2024/4/19 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每天一道LeetCode-----将间隔集中有重叠的间隔合并 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Merge Intervals

原題鏈接Merge Intervals

合并所有有重疊的間隔

對于兩個間隔interval1和interval2,二者有重疊的情況為

  • interva1全部包含interval2,也就是說interval1.start <= interval2.start && interval1.end >= interval2.end。例如[2, 3]和[1, 5]
  • interval2全部包含interval1,同上。例如[1, 5]和[2, 3]
  • interval1和interval2有交集,且interval1.start <= interval2.start。例如[1, 3]和[2, 4]
  • interval1和interval2有交集,且interval1.start >= interval2.start。例如[2, 4]和[1, 3]

所以,為了減少情況,首先應該確保interval1一定在interval2左邊,也就是確保interval1.start <= interval2.start。那么就需要將原間隔集合根據間隔的開始位置排序

但是此時仍然有三種情況需要討論,但是,可以反過來考慮,即二者沒有重疊的情況為

  • 前一個間隔的結束位置小于后一個間隔的開始位置,即interval1.end < interval2.start

所以,可以先判斷二者是不是沒有重疊,否則,就一定有重疊,不需要考慮三種有重疊的情況。
那么,如果有重疊時,就需要記錄合并之后的開始位置和結束位置

  • 開始位置為兩個間隔開始位置的較小者
  • 結束位置為兩個間隔結束位置的較大者

代碼如下

/*** 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 Solution { public:vector<Interval> merge(vector<Interval>& intervals) {vector<Interval> res;if(intervals.empty())return res;std::sort(intervals.begin(), intervals.end(), ComInterval);/* [start, end]為上一個沒有添加到結果集中的間隔 */int start = intervals[0].start;int end = intervals[0].end;for(int i = 1; i < intervals.size(); ++i){/* 如果上一個間隔和當前間隔沒有重疊,就將上一個間隔添加到結果集中 */if(end < intervals[i].start){res.emplace_back(Interval(start, end));start = intervals[i].start;end = intervals[i].end;}else{/* 有重疊,合并兩個間隔 */start = std::min(intervals[i].start, start);end = std::max(intervals[i].end, end);}}res.emplace_back(Interval(start, end));return res;} private:static bool ComInterval(const Interval& lhs, const Interval& rhs){return lhs.start < rhs.start;} };

Insert Interval

原題鏈接Insert Interval

給定一個按照開始位置遞增排序且無重疊的間隔集合,插入給定的間隔,并合并有重疊的間隔

有三種情況

  • 在待插入間隔前面的且和它無重疊的間隔,只需要放到結果集中
  • 與待插入間隔有重疊的間隔和待插入間隔合并成一個間隔,放到結果集中
  • 在待插入間隔后面的且和它無重疊的間隔,只需要放到結果集中

第一步只需要判斷沒有重疊即可
第三步只需要找到第一個和待插入間隔無重疊的間隔即可

代碼如下

/*** 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 Solution { public:vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {vector<Interval> res;int i = 0;for(; i < intervals.size(); ++i){/* 在待插入間隔前面的間隔,如果沒有重疊就直接添加到結果集中 */if(newInterval.start > intervals[i].end){res.emplace_back(intervals[i]);}/* 找到了后面第一個和待插入間隔無重疊的間隔,跳出,直接將后面的間隔添加到結果集中 */else if(newInterval.end < intervals[i].start){break;}/* 有重疊,合并成一個,改變待插入間隔的起止位置 */else{newInterval.start = std::min(newInterval.start, intervals[i].start);newInterval.end = std::max(newInterval.end, intervals[i].end);}}/* 插入待插入間隔,將后面的間隔依次添加 */res.emplace_back(newInterval);while(i < intervals.size())res.emplace_back(intervals[i++]);return res;} };

這兩道題主要就是如果判斷兩個間隔有重疊部分,方法是先判斷沒有重疊,否則就一定有重疊。剩下的就是不斷的插入到結果中

總結

以上是生活随笔為你收集整理的每天一道LeetCode-----将间隔集中有重叠的间隔合并的全部內容,希望文章能夠幫你解決所遇到的問題。

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