k8s使用NFS建立持久卷
阿新 • • 發佈:2021-01-01
技術標籤:Leetcode刷圖
連結:https://leetcode-cn.com/problems/non-overlapping-intervals/
給定一個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。
注意:
- 可以認為區間的終點總是大於它的起點。
- 區間 [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 解釋: 你不需要移除任何區間,因為它們已經是無重疊的了。
思路:我們轉換一下題目,實際上就是找到儘可能多的區間,使得他們不衝突。有刷題經驗的大夥應該知道一個經典的活動安排問題,實際上本題只是那題的一種包裝罷了。首先我們很容易想到這是一道貪心題,但是有不同的貪心策略,一般來說,我們會想到貪左端點小的,貪右端點小的,貪區間小的。
策略1:貪左端點小的
如上圖,貪區間左端點小的,但是左端點小不代表區間短,會導致兩個長度短的區間無法選擇,因此不可能是最優。
策略2:貪區間長度小的
如上圖所示,如果貪區間小的,會導致兩個不衝突的長區間無法選擇,因此不可能是最優。
策略3:貪右端點小的
我們貪右端點小的,我們假設已經選定了首區間,那麼肯定是這個區間的右端值越小,後面才越有可能加入更多的區間。
如上圖所示,3如果與1發生衝突,則必與2發生衝突,而與2衝突則不一定與1衝突,所以貪右端點小才是正確的,而其實我們並不關係左端點,因為結果與左端點的值並無關係。
class Solution { public: //需要保留最多的區間 不就是安排活動問題嗎 static bool cmp(vector<int> A,vector<int> B){ return A[1] < B[1]; } int eraseOverlapIntervals(vector<vector<int>>& intervals) { sort(intervals.begin(),intervals.end(),cmp); int n = intervals.size(), i, right, ans = 1; if( n == 0 )return 0; right = intervals[0][1]; for(i = 1; i < n; ++ i){ if(intervals[i][0] >= right ){ ++ ans; right = intervals[i][1]; } } return n - ans; } };