leetcode435.无重叠区间(中等)

属于区间问题的第二类题。 思路一:贪心 实现细节:按照右端点从小到大排序。

class Solution {
          
   
public:
    static bool cmp(const vector<int>& v1, const vector<int>& v2){
          
   
        return v1[1] < v2[1];
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
          
   

        int n = intervals.size();
        sort(intervals.begin(), intervals.end(), cmp);
        int r = INT_MIN, ans = 0;
        for (auto& each : intervals) {
          
   
            if (each[0] >= r) {
          
   
                ans++;
                r = each[1];
            }
        }
        return n - ans;
    }
};

方法二:dp(超时,通不过,只用来拓展思路) 题目等价为:不重叠找出最多的区间 具体思路:先按照左端点/右端点升序排列。 dp[i]表示以v[i]结尾最多的区间个数。 转移方程:dp[i]=dp[j]+1 (0<=j<i且v[j].second <= v[i].first) 复杂度达到O(n^2)太高了,超时。。。。

class Solution {
          
   
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
          
   

        int n = intervals.size();
        vector<int> dp(n, 1);
        vector<pair<int, int>> v;
        sort(intervals.begin(), intervals.end());
        for (auto& each : intervals) {
          
   
            v.push_back({
          
   each[0], each[1]});
        }
        for (int i = 1; i < n; ++i) {
          
   
            for (int j = 0; j < i; ++j) {
          
   
                if (v[j].second <= v[i].first) dp[i] = max(dp[i], dp[j] + 1);
            }
        }
        return n - dp[n - 1];
    }
};
经验分享 程序员 微信小程序 职场和发展