Day27:455.分发饼干、376. 摆动序列、53. 最大子序和


455.分发饼干

题目链接

思路

先排序,将饼干和胃口从小到大排序。

  1. 用饼干匹配胃口
    从小到大动饼干,当饼干数量不足以满足胃口,找下一堆饼干,直到饼干数量满足胃口
 for(int i=0;i<s.size();i++){
            if(index<g.size()&&g[index]<=s[i]){
                index++;
                count++;
            }
        }
  1. 用胃口寻找饼干
    从小到大动胃口,移动胃口找饼干。当胃口大于饼干则用while循环找满足胃口的饼干位置,但是在这里我卡了一段时间,因为我用从小到大遍历时忘记考虑一种情况:当胃口为{1,2,3},饼干为{3}时,然后按如下代码,则会发现最后输出为3。
int index=0;
int count=0;
for(int i=0;i<g.size();i++){
          while(index<s.size()&&s[index]<g[i]){
              index++;
          }
          if(index<s.size()&&s[index]>=g[i])count++;
      }

这是因为当index=0时i=0可以满足第一个人的胃口,但index没有改变,所以当i=2,i=3时一直在重复计算,修改后代码如下,也是可以顺利通过力扣

代码实现

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(),g.end());
        sort(s.begin(),s.end());
        int index=0;
        int count=0;
        for(int i=0;i<s.size();i++){
            if(index<g.size()&&g[index]<=s[i]){
                index++;
                count++;
            }
        }
        return count;
    }
};

总结

这道题有很多方法可以解决,重点是掌握思路,除了从小到大,也可以从大到小查找


376. 摆动序列

题目链接

思路

用前一个两元素差pre和当前两元素之差cur相比较
摆动情况:

  1. cur>0&&pre<=0
  2. cur<0&&pre>=0

特殊情况:

  1. 只有一个元素或者没有元素,返回数组本身大小即可
  2. 含两个元素:当两元素之差为0,则序列大小为一,否则则为2
    在这里插入图片描述
```cpp
if(nums.size()<3){
            if(nums.size()==2&&nums[0]==nums[1])return 1;
            return nums.size();
        }
  1. 单调坡上的平坡
    这个最容易被忘记,虽然我想到了但是不知道咋改代码,看了卡哥答案才知道自己一直理解错了。
    因为当pre>0,cur=0(即cur在1-2间,cur在2-2间)时还为一个摆动序列,此时更新pre=cur=0;当cur=0就不满足条件了,此时pre不需要更新。直到cur>0,此时又是一个摆动序列。在这里插入图片描述

  2. 凸坡上的平坡
    当pre>0,cur=0时记录一组数据,当cur继续为0时则不需要再更新pre,直到下一个摆动序列再更新pre
    在这里插入图片描述

 for(int i=1;i<nums.size();i++){
            cur=nums[i]-nums[i-1];
            if(pre>=0&&cur<0||pre<=0&&cur>0){
                count++;
                pre=cur;
            }
        }

代码实现

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        int pre=0;
        int cur;
        int count=1;
        if(nums.size()<3){
            if(nums.size()==2&&nums[0]==nums[1])return 1;
            return nums.size();
        }
        for(int i=1;i<nums.size();i++){
            cur=nums[i]-nums[i-1];
            if(pre>=0&&cur<0||pre<=0&&cur>0){
                count++;
                pre=cur;
            }
        }
        return count;
    }
};

53. 最大子序和

题目链接

思路

想清楚了这道题就会很简单。
首先直接计算前n个值之和,当sum和<0则直接舍弃,从下一个数开始计算sum。因为不管怎么样一个负数都只会连累接下来的最大值。在sum增加时也要记录下目前值是否最大,最后返回sum。代码很简单不多说。

代码实现

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int sum=0,result=INT_MIN;
        for(int i=0;i<nums.size();i++){
            sum+=nums[i];
            if(result<sum)result=sum;
            if(sum<0){
                sum=0;
            }
        }
        return result;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值