解題思路
- 畫圖 -> 轉換成線段問題
- 排序:起點(左)升序排序,起點一樣按照終點(右)降序排序。
- 分三種情況討論:覆蓋、相交、無交集
注意引數寫法
二維vector自定義排序(c++ lambda寫法)
// 二維vector排序:起點(左)升序排序,起點一樣按照終點(右)降序排序
sort(intervals.begin(), intervals.end(), [](vector<int>& a, vector<int>& b) {
if (a[0]!= b[0]) return a[0]<b[0]; // 起點升序
return a[1]>b[1]; // 終點降序
});
模版 - Leetcode1288.刪除被覆蓋區間
class Solution {
public:
int removeCoveredIntervals(vector<vector<int>>& intervals) {
// 二維vector排序:起點(左)升序排序,起點一樣按照終點(右)降序排序
sort(intervals.begin(), intervals.end(), [](vector<int>& a, vector<int>& b) {
if (a[0]!= b[0]) return a[0]<b[0]; // 起點升序
return a[1]>b[1]; // 終點降序
});
int l=intervals[0][0];
int r=intervals[0][1];
int ans=0;
// 分三種情況討論
for(int i=1;i<intervals.size();i++)
{
int a=intervals[i][0];
int b=intervals[i][1];
// 情況1:某一個區間完全覆蓋了另一個區間(不需要更新邊界,上面的範圍比下一個大,因為終點降序排的)
if(a>=l && b<=r)
ans++;
// 情況2:部分相交 -> 合併成一個更大的區間 (保留起點,更新終點)
if(a<=r && b>=r)// if(a>=l && b>r)
r=b;
// 情況3:完全不相交 -> 更新起點和終點
if(a>r)
l=a,r=b;
}
return intervals.size()-ans;
}
};
變形題
56.合併區間
986.區間列表的交集
參考
戳這裡-微信公眾號