區間問題(非DP型別)及變形

抓水母的派大星發表於2024-03-17

解題思路

  1. 畫圖 -> 轉換成線段問題
  2. 排序:起點(左)升序排序,起點一樣按照終點(右)降序排序。
  3. 分三種情況討論:覆蓋、相交、無交集

注意引數寫法

二維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.區間列表的交集

參考

戳這裡-微信公眾號

相關文章