题1:
指路:455. 分发饼干 - 力扣(LeetCode)
思路与代码:
本题要求返回最多能满足的数量。根据对应原则,应当是大饼干满足胃口大的孩子,小饼干满足胃口小的孩子以物尽其用。我们可以从饼干入手,以大饼干为基准,选出它能满足的最大胃口的小孩作为局部最优解。以此类推,每次选出最大尺寸的饼干以满足胃口较大的小孩从而得出满足数量。代码如下:
cpp
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int res = 0; // 喂饱了多少小孩
int index = s.size() - 1;
for (int i = g.size() - 1; i >= 0; i--) {
// for循环控制小孩子的胃口
if (index >= 0 && s[index] >= g[i]) {
// if控制饼干的数量
res++;
index--;
}
}
return res;
}
};
题2:
指路:376. 摆动序列 - 力扣(LeetCode)
思路与代码:
找峰值波动:如果当前节点和上一节点的差值(prediff) 与下一节点和当前节点的差值(curdiff) 异号则符合条件。然而本题还有特殊情况:1.上下坡中有平坡 ,[1, 2, 2, 2, 2, 1]这样的数组实际摆动序列为3,我们可以删除最左边的三个二来满足条件;2.峰值出现在数组两端 ,在计算波动时需要三个数字,但数组两端的数字计算起来只有两个数字,对此,解决方法为:假设数组最前面还有一个数字,例如[2, 5],我们可以假设为[2, 2, 5],prediff = 0而curdiff = 3不为0为波谷,有坡度;3单调坡度上有平坡,[1, 2, 2, 3, 4]最终结果为2,因为3,4阶段无波动,对此,我们在有波动时更新prediff可解决。代码如下:
cpp
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if (nums.size() <= 1) return nums.size();
int curdiff = 0;
int prediff = 0;
int reslut = 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) ) {
reslut++;
prediff = curdiff;
}
}
return reslut;
}
};