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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

435. 无重叠区间(贪心算法)

發布時間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 435. 无重叠区间(贪心算法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給定一個區間的集合,找到需要移除區間的最小數量,使剩余區間互不重疊。

注意:

可以認為區間的終點總是大于它的起點。
區間 [1,2] 和 [2,3] 的邊界相互“接觸”,但沒有相互重疊。

示例 1: 輸入: [ [1,2], [2,3], [3,4], [1,3] ]

輸出: 1

解釋: 移除 [1,3] 后,剩下的區間沒有重疊。

示例 2:
輸入: [ [1,2], [1,2], [1,2] ]

輸出: 2

解釋: 你需要移除兩個 [1,2] 來使剩下的區間沒有重疊。

示例 3:
輸入: [ [1,2], [2,3] ]

輸出: 0

解釋: 你不需要移除任何區間,因為它們已經是無重疊的了。

這道題有些難度,官方解法給了一個動態規劃一個貪心,這里就說說貪心如何做;

首先應該想到的是對這個二維數組進行排序,是以左邊界排序好還是以右邊界排序好呢?

題目讓求移除區間的最小數量,那么
如果以左邊界排序,就得從右向左遍歷,每次找左邊界最大的,這樣就留給前一個的空間最大;
如果以右邊界排序,就得從左向右遍歷,每次找右邊界最小的,留給下一個區間的空間就最大;

這里我用的是以右邊界排序,從左向右記錄非交叉區間的個數。最后用 區間總數 減去 非交叉區間的個數 就是需要移除的區間個數了;

局部最優:優先選擇右邊界最小的,給下一個區間留下更大的空間;
全局最優:得到最多的非交叉區間;

就拿示例一來說:如圖,end是最小右邊界,ans是非交叉區間的個數

代碼如下:

class Solution { public:static bool cmp (const vector<int>& a, const vector<int>& b) {return a[1] < b[1];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.size() == 0) return 0;int ans = 1;sort(intervals.begin(), intervals.end(), cmp);int end = intervals[0][1];for (int i = 1; i < intervals.size(); ++i) {//每次取非交叉區間的時候,都是右邊界最小的來做分割點(這樣留給下一個區間的空間就越大)if (end <= intervals[i][0]) {end = intervals[i][1];ans++;}}return intervals.size() - ans;} };

總結

以上是生活随笔為你收集整理的435. 无重叠区间(贪心算法)的全部內容,希望文章能夠幫你解決所遇到的問題。

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