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
解釋: 你不需要移除任何區間,因爲它們已經是無重疊的了。
代碼
最初想複雜了想用掃線法發現不能用。唉。
class Solution {
public:
static bool mycmp(vector<int>& a, vector<int>& b) {
return a[1] < b[1];//對每行的右值進行對比
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if (intervals.empty())return 0;
int res = 0;
//對右值排序才能使需要移除區間數最小。
sort(intervals.begin(), intervals.end(),mycmp);
int right = intervals[0][1];
for (int i = 1; i < intervals.size(); i++) {
if (intervals[i][0] < right)//說明有重疊部分刪除
res++;
else
right = intervals[i][1];//說明沒重疊部分更新右值
}
return res;
}
};
int main() {
//[ [1,2], [2,3], [3,4], [1,3] ]
vector<vector<int>>vec = { {1,2},{2, 3},{3,4}, {1,3} };
Solution S;
cout << S.eraseOverlapIntervals(vec) << endl;// 結果爲1
return 0;
}