理论基础
文档讲解:代码随想录
贪心算法没有固定的套路,一般是从局部最优推到全局最优。
455.分发饼干
题目链接:455.分发饼干
文档讲解:代码随想录
思路
局部最优:大饼干先喂给大胃口
全局最优:满足孩子数量最多
代码
class Solution {
public:
int findContentChildren(vector<int> &g, vector<int> &s) {
int result = 0;
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int idx = s.size() - 1;
for (int i = g.size() - 1; i >= 0; i--) {
for (int j = idx; j >= 0; j--) {
if (g[i] <= s[j]) {
idx--;
result++;
break;
}
}
}
return result;
}
};
376. 摆动序列
题目链接:376. 摆动序列
文档讲解:代码随想录
思路
峰值点的寻找方法:三个点,前两个点递增(或递减)prediff > 0
,后两个点递减(或递增)curdiff < 0
。
-
上下坡之间的平坡:只需保留平坡中的最左或最右侧一个值。
-
数组首尾两端:假设数组最前面还有一个数字与数组第一个元素相同.
-
单调坡度有平坡:在坡度摆动变化的时候更新
prediff
。
代码
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;
}
}
return result;
}
};
53. 最大子序和
题目链接:53. 最大子序和
文档讲解:代码随想录
思路
类似滑动窗口,不断扩大窗口的后端,直到窗口内的和小于0,这时更新窗口前端。因为当窗口内的和小于0时再扩大窗口,则原窗口内的负值会拉低新加入窗口的值。
定义一个保存最大值变量的值,如果当前窗口内的和大于最大值,则更新最大值。
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;
}
};