贪心算法
一、分发饼干
排序胃口和饼干,同时遍历两个数组,如果满足胃口,都移动,否则饼干移动
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
//满足最多数量的孩子,s[j] = g[i],一个孩子只能给一块饼干
//两个数组进行排序
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int lenG = g.size();
int lenS = s.size();
int i = 0;
int j = 0;
int sum = 0;
while (lenG > 0 && lenS > 0) {
if (s[j] >= g[i]) {
sum++;
j++;
i++;
lenG--;
lenS--;
}
else {
j++;
lenS--;
}
}
return sum;
}
};
二、摆动序列
遍历数组,变量记录下一个要找比它的大的还是小的
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
//摆动序列,第二个数比第一个大/小,第三个比第二个小/大,第四个又比第三个大/小
//遍历循环,记录上一个数,先找比它大的,再找比它小的
int sum = 1;
int pre = nums[0];
int flag = 0;
for (int i = 1; i < nums.size(); i++) {
if (nums[i] > pre && flag != 1) {
flag = 1;
sum++;
}
if (nums[i] < pre && flag != 2) {
flag = 2;
sum++;
}
pre = nums[i];
}
return sum;
}
};
三、最大子序和
局部最优解为当前序列和最大,当和为负数时,下次从i+1开始遍历
class Solution {
public:
int maxSubArray(vector<int>& nums) {
//最大和的连续子数组
//暴力解法,双重循环,超时
int max = INT_MIN;
int count = 0;
for (int i = 0; i < nums.size(); i++) {
count += nums[i];
if (count > max) max = count;
if (count < 0) count = 0;
}
return max;
}
};
总结
贪心没有固定的模板,主要是一个思考逻辑,从局部最优推向全局最优,但也不用拘泥于此
学习时间90min。
学习资料:《代码随想录》。