区间处理——无重叠区间

原题在这里

看这个题就想起了前面写过的合并区间,我寻思(瞎搞)着可能差不多,于是对区间左端点排序然后双指针遍历,

然后发现写不出来(爇鞲)。。。

我又想这肯定dp也能做,但是dp我真不太行(真懒,一点都没有思考),索性直接看题解了,

果然解法一:dp

  因为是dp,所以无论左端点右端点排序都行,转移方程f[i]=max(f[i],f[j]+1),(i<j&&li>=rj)

    按dp来说,这是非常水的水题,但是我真没思考。。。

解法二:贪心

  对右端点排序,正常li>=rj,ans++遍历就行了

【太蠢了所以Over】

学到了vector容器的sort指定排序写法:

sort(intervals.begin(), intervals.end(), [](const auto &u, const auto &v)
             { return u[1] < v[1]; });

AC_code:

class Solution
{
public:
    int eraseOverlapIntervals(vector<vector<int>> &intervals)
    {
        if (intervals.empty())
            return 0;

        sort(intervals.begin(), intervals.end(), [](const auto &u, const auto &v)
             { return u[1] < v[1]; });

        int n = intervals.size();
        int right = intervals[0][1];
        int ans = 1;
        for (int i = 1; i < n; ++i)
        {
            if (intervals[i][0] >= right)
            {
                ++ans;
                right = intervals[i][1];
            }
        }
        return n - ans;
    }
};
View Code

 

posted @ 2022-03-17 11:54  Renhr  阅读(24)  评论(0)    收藏  举报