C#6.0新語法示例詳解
阿新 • • 發佈:2020-12-22
給定一個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。
注意:
可以認為區間的終點總是大於它的起點。
區間 [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 解釋: 你不需要移除任何區間,因為它們已經是無重疊的了。
解答
之前刷過一次了435. 無重疊區間。貪心,將區間按右邊界排序,要使不重疊的區間更多,需要當前不重疊區間的右邊界儘可能小,然後依次將不重疊的區間計數:
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.size() < 2)
return 0;
sort(intervals.begin(), intervals.end(), [](const vector< int>& a, const vector<int>& b){ return a[1] <= b[1]; });
// 記錄當前不相交區間的右邊界
int end = intervals[0][1];
int count = 1;
for(const auto& interval : intervals){
if(interval[0] >= end){
end = interval[1];
count++;
}
}
return intervals.size() - count;
}
};