刷题day27
贪心算法
说实话贪心算法并没有固定的套路。
所以唯一的难点就是如何通过局部最优,推出整体最优。
不好意思了,贪心没有套路,说白了就是常识性推导加上举反例。
leetcode 455 分发饼干
https://leetcode.cn/problems/assign-cookies/description/
思路:小饼干先喂给胃口小的保证局部最优
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int index = 0;
for(int i = 0; i<s.size();++i)
{
if(index<g.size() && s[i] >= g[index])
{
index++;
}
}
return index;
}
leetcode 376 摆动序列
int wiggleMaxLength(vector<int>& nums) {
// 单元素序列
if(nums.size() == 1) return nums.size();
int curDiff = 0;
int preDiff = 0;
int result = 1;
for(int i=1; i<nums.size(); ++i)
{
curDiff = nums[i] - nums[i-1];
if((preDiff>=0 && curDiff <0) || (preDiff<=0 && curDiff>0))
{
result++;
}
if(nums[i] != nums[i-1]) preDiff = curDiff;
}
return result;
}
leetcode 53. 最大子数组和
可以尝试使用分而治之的策略
int maxSubArray(vector<int>& nums) {
int result = *max_element(nums.begin(), nums.end());
int sum = 0;
for(int i=0; i<nums.size();++i)
{
sum += nums[i];
if(sum < 0)
sum = 0;
else
result = result > sum ? result : sum;
}
return result;
}