【合并区间】排序 + 双指针
生活随笔
收集整理的這篇文章主要介紹了
【合并区间】排序 + 双指针
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:
以數組 intervals 表示若干個區間的集合,其中單個區間為 intervals[i] = [starti, endi] 。請你合并所有重疊的區間,并返回一個不重疊的區間數組,該數組需恰好覆蓋輸入中的所有區間。
難點:給的區間的大小次序是亂的。
第一次:
思路:如果當前區間的左端點在數組 merged 中最后一個區間的右端點之后,那么它們不會重合,我們可以直接將這個區間加入數組 merged 的末尾;
否則,它們重合,我們需要用當前區間的右端點更新數組 merged 中最后一個區間的右端點,將其置為二者的較大值。
代碼:
vector<vector<int>> merge(vector<vector<int>>& intervals) {if(intervals.size() == 1){return intervals;}//先排序,根據Start先排序,確保前一個的Start小于后一個sort(intervals.begin(),intervals.end());vector<vector<int>> res;res.push_back(intervals[0]);//先把第一個壓入int j = 0;//基數組,以此作為基礎合并for(int i = j + 1;i < intervals.size();i++){//判斷,如果第二個子數組的start小于前一個的End,就合并,否則直接壓入if(intervals[i][0] <= res[j][1]){//判斷前后兩個子數組End值大小,取最大的為End//因為之前排序過,所以Start是前一個較小res[j][1] = max(res[j][1],intervals[i][1]); 。}else{res.push_back(intervals[i]);//只有合并完成,才會往后判斷,否則一直基于此子數組進行合并j++;}}return res;}繼續優化:
思路:思路:我們不斷更新區間的右端點即可,在遍歷里邊放一層循化j = i+1 ,循壞條件是 j<len && 條件 ,如果滿足更新右端點,j++。在循環結束后,那么這個右端點與之前的左端點組成的的新區間就是答案。再讓i = j ,繼續。
代碼:
vector<vector<int>> merge(vector<vector<int>>& intervals) {sort(intervals.begin(),intervals.end());vector<vector<int>>ans;int len=intervals.size();for(int i=0;i<len;){int t=intervals[i][1];int j=i+1;while(j<len&&intervals[j][0]<=t){t=max(t,intervals[j][1]);j++; //先賦值再加}ans.push_back({intervals[i][0],t});i=j;//先賦值再加}return ans;}總結
以上是生活随笔為你收集整理的【合并区间】排序 + 双指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2019中接连MySQL全部过程
- 下一篇: lambda 函数与 Generator