第八章 贪心算法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;
}
};

浙公网安备 33010602011771号