class Solution
{
public:
int findContentChildren(vector<int> &g, vector<int> &s)
{
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int cnt=0;
for(int i=0,j=0;i<g.size()&&j<s.size();j++){
if(g[i]<=s[j]){
cnt++;
i++;
}
}
return cnt;
}
};
想法是小饼干满足小胃口的,一直找下去。做是做出来了,但是不明白怎么就是贪心算法了。
时间复杂度o(nlogn)
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;
}
};
还是看不出有什么贪心的。
判断前后的差值是否相反,如果出现相反才改变后的值。
题目链接:53. 最大子数组和 - 力扣(LeetCode)
class Solution
{
public:
int maxSubArray(vector<int> &nums)
{
int sum=INT_MIN;
int count=0;
for(int i=0;i<nums.size();i++){
count+=nums[i];
sum=count>sum?count:sum;
count=count>0?count:0;//如果count小于0,必定使得后面的元素和count的和小于该元素本身
}
return sum;
}
};
有一点明白所谓的贪心了,大概吧(心虚。
就是往大了搞,怎么大怎么搞,如果是负数就丢掉不要。
感觉这和平时的思考方式是一样的,就算没有刻意去学什么贪心算法都可以写出这种逻辑的代码,所以会贪心==不会贪心。越不贪心越贪心。