455. 分发饼干
思路:
为了满足更多的人,可以用大饼干投喂大胃口的人,满足s[i]>=g[j]即可。
代码:
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int index=s.size()-1;
int res=0;
for(int i=g.size()-1;i>=0;i--)
{
if(index>=0 && s[index]>=g[i])
{
res++;
index--;
}
}
return res;
}
};
376. 摆动序列
思路:
求序列的最大子序列长度可以在遇到摆动时将result++,最后返回result结果即可,难点在于如何判定摆动。设第i个位置与前一个位置的差值是pre,与后一个元素的差值是cur,摆动的判定主要分为以下三点:1、当序列长度大于2,pre与cur的符号相异时一定有摆动,同时如果pre为0但是cur不为0,也一定有一边可能存在摆动;2、如果序列长度为2时,将pre值先给定为0,此时就将序列长度向前扩充了一位,出现摆动的情况就包含在情况1当中了;3、单调有平波时,如果出现单增平单增平单增平的数列,最大摆动子序列为2,以上的判断逻辑就会失效,这是由于在每次遍历中pre都会被cur更新,解决办法是pre只在确认有摆动的时候更新。
代码:
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size()==1) return 1;
int pre=0;
int cur=0;
int res=1;
for(int i=0;i<nums.size()-1;i++)
{
cur=nums[i+1]-nums[i];
if ((pre <= 0 && cur > 0) || (pre >= 0 && cur < 0))
{
res++;
pre=cur;
}
}
return res;
}
};
53. 最大子数组和
思路:
这道题的子数组必须是原数组中连续的一段,为了保持子数组的和最大,首先在遍历的时候,如果和为负数,就直接舍弃,从下一个元素重新开始,其次为保证最大值,要实时更新最大值。
代码:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int res=INT32_MIN;
int count=0;
for(int i=0;i<nums.size();i++)
{
count+=nums[i];
if(count>res) res=count;
if(count<0) count=0;
}
return res;
}
};