每天一道LeetCode-----将间隔集中有重叠的间隔合并
生活随笔
收集整理的這篇文章主要介紹了
每天一道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-----将间隔集中有重叠的间隔合并的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天一道LeetCode-----将m
- 下一篇: IA-32 Intel手册学习笔记(二)