刷题笔记_1 | 贪心算法 | C++ | leetcode435

本文介绍了如何利用贪心策略解决LeetCode 435题的区间重叠问题。通过优先保留区间尾部小且不相交的区间,展示了C++代码实现并解释了参数&和const的作用。学习如何在排序和区间处理中应用贪心算法,提高代码效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、贪心算法思想

采用贪心策略,保证每次操作都是局部最优的从而使最后得到的结果是全局最优的。

2、LeetCode435

题目描述:(区间问题)

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
在这里插入图片描述

解答思路:

在选择保留区间时,区间的结尾十分重要。选择区间结尾越小,余留给其他区间的空间就越大,就越能保留更多的区间。因此,我们采取的贪心策略为,优先保留结尾小且不相交的区间。
1、按照区间尾部,从小到大进行排序
2、遍历排序后的数组,取一个变量记录从左往右遍历的最优结果的当前尾部,如果首部小于当前尾部的区间,则有了重叠进行删除,如果没有,则将其的尾部更新为当前尾部。

C++实现代码

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if(intervals.empty()){
            return 0;
        }
        int n = intervals.size();
        //[](vector<int> u, vector<int> v
        //sort(intervals.begin(), intervals.end(), [](vector<int> u, vector<int> v)
        //注意此处const与&的使用
        sort(intervals.begin(), intervals.end(), [](const auto& u, const auto& v) {
            return u[1] < v[1];   //比较尾部;  如果是比较首部的话采用 u[0] > v[0]
        });
        int total = 0, prev = intervals[0][1];
        for(int i = 1; i < n; i++){
            if(intervals[i][0] < prev){
                total++;
            }
            else{
                prev = intervals[i][1];
            }
        }
        return total;
    }
};

注:
1、问题:在使用sort排序时,一开始没有用&(引用),代码提交测试后的运行时间为 92ms+,替换成vector<int>& 后运行时间变为12ms,速度大大提升。
2、分析:采用&而省去了创建变量复制的时间。最终代码修改为const auto&。其中const的使用是为了防止程序对变量的修改。具体理解如下:

C++小课堂

在这里插入图片描述在这里插入图片描述

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值