leetcode 435无重叠区

简介: leetcode 435无重叠区

无重叠区


e091f7d3668942558e6a176475f29a88.png

按照右边界排序,就要从左向右遍历,因为右边界越小越好,只要右边界越小,留给下一个区间的空间就越大,所以从左向右遍历,优先选右边界小的。

按照左边界排序,就要从右向左遍历,因为左边界数值越大越好(越靠右),这样就给前一个区间的空间就越大,所以可以从右向左遍历。


9c49ec764d28448cadfb3efd41f6fd02.png

我来按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了。


此时问题就是要求非交叉区间的最大个数。


右边界排序之后,局部最优:优先选右边界小的区间,所以从左向右遍历,留给下一个区间的空间大一些,从而尽量避免交叉。全局最优:选取最多的非交叉区间。

class Solution {
public:
    // 按照区间右边界排序
    static bool cmp (const vector<int>& a, const vector<int>& b) {
        return a[1] < b[1];
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if (intervals.size() == 0) return 0;
        sort(intervals.begin(), intervals.end(), cmp);
        // for(auto it:intervals)
        //     cout<<'['<<it[0]<<','<<it[1]<<']'<<endl;
        int count = 1; // 记录非交叉区间的个数
        int end = intervals[0][1]; // 记录区间分割点
        for (int i = 1; i < intervals.size(); i++)
        {
            if (end <= intervals[i][0]) //如果下一个的前面大于等于上一个的后面,是非重叠
            {
                end = intervals[i][1];
                count++; //非重叠数
            }
        }
        return intervals.size() - count; //总数减去非重叠的数,就是移除重叠的数
    }
};

二刷

class Solution {
public:
    static bool cmp(vector<int> &a , vector<int> &b)
    {
        if(a[0] == b[0]) return a[1] < b[1];
        else  return a[0] < b[0];
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if(intervals.size() <=1) return 0;
        int result = 0;
        sort(intervals.begin(),intervals.end(),cmp);
        for(int i=1 ; i<intervals.size() ;i++)
        {
            if(intervals[i][0] < intervals[i-1][1])
            {
                result++;
                intervals[i][1] = min(intervals[i][1],intervals[i-1][1]); 
            }
        }
        return result;
    }
};
相关文章
|
1月前
leetcode-435:无重叠区间
leetcode-435:无重叠区间
19 0
|
1月前
代码随想录Day30 贪心05 LeetCode T435无重叠区间 T763划分字母区间 T56 合并区间
代码随想录Day30 贪心05 LeetCode T435无重叠区间 T763划分字母区间 T56 合并区间
34 0
|
7月前
|
人工智能 算法
代码随想录算法训练营第三十五天 | LeetCode 435. 无重叠区间、763. 划分字母区间、56. 合并区间
代码随想录算法训练营第三十五天 | LeetCode 435. 无重叠区间、763. 划分字母区间、56. 合并区间
44 0
|
人工智能 算法 C++
每日算法系列【LeetCode 1031】两个非重叠子数组的最大和
每日算法系列【LeetCode 1031】两个非重叠子数组的最大和
|
索引
每日一题[LeetCode 689]三个无重叠子数组的最大和
闲来无事,为了保证日更,从今天开始每天更新一道LeetCode题解。 做题顺序是这样的:随机选择一题“困难”类型的题目。 因本人ACM退役颇久,代码多有疏漏,望多多见谅。
LeetCode1477-找两个和为目标值且不重叠的子数组
LeetCode1477-找两个和为目标值且不重叠的子数组
|
Python
LeetCode 435. 无重叠区间
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
76 0
LeetCode 836. 矩形重叠 Rectangle Overlap
LeetCode 836. 矩形重叠 Rectangle Overlap
LeetCode 836. 矩形重叠 Rectangle Overlap
代码随想录刷题|LeetCode 435. 无重叠区间 763.划分字母区间 56. 合并区间
代码随想录刷题|LeetCode 435. 无重叠区间 763.划分字母区间 56. 合并区间
代码随想录刷题|LeetCode 435. 无重叠区间 763.划分字母区间 56. 合并区间
|
存储 算法
LeetCode 435. 无重叠区间(贪心算法,动态规划)
LeetCode 435. 无重叠区间(贪心算法,动态规划)
101 0
LeetCode 435. 无重叠区间(贪心算法,动态规划)