第八章 贪心算法part01

2026.03.18 02.26 第三十天

455 分发饼干

贪心算法的第一题,由于孩子胃口不同,优先将大块饼干分配给胃口大的孩子即可。

先将饼干和胃口进行排序,而后从大到小进行分配即可。

要注意饼干的边界值判断。

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(), g.end());
        sort(s.begin(), s.end());
        int sIndex = s.size() - 1;
        int num = 0;
        for(int i = g.size() - 1; i >= 0; i--) {
            if(sIndex >= 0 && s[sIndex] >= g[i]) {
                num++;
                sIndex--;
            }
        }
        return num;
    }
};

376 摇摆序列

探寻变化这个想法太天才了,同时配合只在坡度变化时更新prediff就可以解决所有情况。

把更新prediff放在if里面可以避免平坡误判,非常关键。

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        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++;
                preDiff = curDiff;
            }
        }
        return result;
    }
};

53 最大子数组和

核心思想是每走一步记录count的值,并对比result,如果count变为负值,只会让未来的数值变小,此时直接将count置零。

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;
    }
};
posted @ 2026-03-18 20:39  遠くの君  阅读(2)  评论(0)    收藏  举报