一、贪心算法
贪心没有套路,只有碰运气(bushi),举反例看看是否可行,(运气好)刚好贪心策略的局部最优就是全局最优。
1、leetcode.cn/problems/assign-cookies/description/" rel="nofollow">分发饼干 455
思路:按照孩子的胃口从小到大的顺序依次满足每个孩子,对于每个孩子,应该选择可以满足这个孩子的胃口且尺寸最小的饼干
class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int d1 = 0, d2 = 0;int cnt = 0;while(d2 < s.size() && d1 < g.size()){if(g[d1] <= s[d2++]){++cnt;++d1;}}return cnt;}
};
2、leetcode.cn/problems/wiggle-subsequence/description/" rel="nofollow">摆动序列 376
贪心:删除单调坡度上的节点,这个坡度就可以有两个局部峰值。所以求长度的问题变成求峰值个数。
class Solution {
public:int wiggleMaxLength(vector<int>& nums) {int cur = 0, pre = 0;int ans = 1;for(int i=0; i<nums.size()-1; ++i){cur = nums[i+1] - nums[i]; // 当前的差值// 差值正负出现变化-->峰值出现if((cur > 0 && pre <= 0) || (cur < 0 && pre >= 0)){++ans;pre = cur; // 只在摆动的时候更新}}return ans;}
};
3、leetcode.cn/problems/maximum-subarray/description/" rel="nofollow">最大子序和 53
思路:负的子序和只会拉低最大子序和
class Solution {
public:int maxSubArray(vector<int>& nums) {int ans = INT_MIN, s = 0;for(int i=0; i<nums.size(); ++i){s += nums[i];if(s > ans)ans = s;if(s < 0)s = 0;}return ans;}
};
二、写在后面
贪心得多练。今天的摆动序列一开始没想出来。