代码随想录算法训练营第三十一天| 贪心算法 part01

455. 分发饼干

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        int total = 0;
        int len1 = g.size();
        int len2 = s.size();
        int len = max(len1, len2);
        sort(g.begin(), g.end());
        sort(s.begin(), s.end());
        int cur1 = 0;
        int cur2 = 0;

        while (cur1 < len1 && cur2 < len2) {
            if (s[cur2] >= g[cur1]) {
                total++;
                cur1++;
                cur2++;
            } else {
                cur2++;
            }
        }
        return total; // 返回结果
    }
};

挺简单的

摆动序列

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        if (nums.size() <= 1) return nums.size(); // 如果数组长度小于等于1,直接返回数组长度,因为无法形成摆动序列
        int curDiff = 0; // 当前一对相邻元素的差值
        int preDiff = 0; // 前一对相邻元素的差值
        int result = 1;  // 记录峰值个数,序列默认序列最右边有一个峰值
        for (int i = 0; i < nums.size() - 1; i++) {
            curDiff = nums[i + 1] - nums[i]; // 计算当前一对相邻元素的差值
            // 出现峰值条件:前一对差值为非正数且当前差值为正数,或前一对差值为非负数且当前差值为负数
            if ((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)) {
                result++; // 峰值个数加1
                preDiff = curDiff; // 更新前一对差值为当前差值,注意这里,只在出现摆动变化的时候更新
            }
        }
        return result; // 返回最大摆动子序列的长度
    }
};

理解困难的地方:

在计算摆动序列的长度时,只要序列中的峰值数量是正确的,添加一个额外的峰值不会改变结果的原因在于摆动序列的长度只与峰值的数量有关,而不依赖于具体的峰值位置。

考虑一个摆动序列,每个峰值之间必然存在一个谷值(或相反)。因此,峰值的数量决定了摆动序列的长度。无论我们在序列中的哪个位置添加一个额外的峰值,只要最终计算的峰值数量是正确的,摆动序列的长度就不会改变。

假设原始序列中有n个峰值,根据定义,摆动序列的长度为n+1。如果我们在序列中添加了一个额外的峰值,导致峰值的数量增加为n+1个,那么最终计算得到的摆动序列的长度仍然是n+2,即便这个额外的峰值实际上并不是序列的真实峰值。因为摆动序列的长度只与峰值的数量相关,而与具体的峰值位置无关。

因此,即使在序列的末尾添加了一个假设的峰值,只要峰值的数量计算正确,最终的摆动序列的长度也会是正确的。

53. 最大子数组和

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int result = INT32_MIN;
        int count = 0;
        for (int i = 0; i < nums.size(); i++) {
            count += nums[i];
            if (count > result) { // 取区间累计的最大值(相当于不断确定最大子序终止位置)
                result = count;
            }
            if (count <= 0) count = 0; // 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和
        }
        return result;
    }
};

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值