leetcode435.无重叠区间(中等)

leetcode435.无重叠区间(中等)_第1张图片
leetcode435.无重叠区间(中等)_第2张图片
leetcode435.无重叠区间(中等)_第3张图片
leetcode435.无重叠区间(中等)_第4张图片

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

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 复杂度达到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];
    }
};

你可能感兴趣的:(#,贪心,leetcode435,无重叠区间)