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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【合并区间】排序 + 双指针

發布時間:2025/3/19 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【合并区间】排序 + 双指针 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:
以數組 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;}

總結

以上是生活随笔為你收集整理的【合并区间】排序 + 双指针的全部內容,希望文章能夠幫你解決所遇到的問題。

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