455.分发饼干
优先把小饼干分给胃口值小的,或者是把大饼干分给胃口大的。
376. 摆动序列
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if (nums.size() <= 1) return nums.size();
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; // 注意这里,只在摆动变化的时候更新prediff
}
}
return result;
}
};
这里有一些初始值的设置是为了应对一些特殊情况的
1.int result = 1;因为当nums尺寸大于等于2时,摆动序列长度至少为1;
2.(preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)
这里加上等于号是因为中间存在平坡的情况,如果不加等于号的话,第一个2其实也算摆动序列,但是不会被计入。
3.if ((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)) {
result++;
preDiff = curDiff; // 注意这里,只在摆动变化的时候更新prediff
}
这里只在摆动变化时更新pre是为了防止非严格单调上升的序列在平坡开始处和平坡截止处各计算一次,导致摆动序列结果多了。
53. 最大子序和
需要两个参数,一个用来记录当前遍历的连续元素之和count,一个用来记录最后的结果result
当count<0的时候,证明for循环当前遍历的元素对整个组合起到了副作用,同时,由于要求子序和是连续的,也就是说count包含的所有元素对子序和都起到了副作用,只能将这一段直接放弃,重新计算字符和,
当得到新的子序和后,将其与result进行比较(这里也是result设置成
INT32_MIN
的原因,是为了防止即使nums中的元素远小于0,result也可以储存下nums元素的信息。