day-31 代码随想录算法训练营(19)贪心part01

455.分发饼干

思路一:贪心思路,大饼干先分给大胃口
思路二:小饼干先分给小胃口

376.摆动序列

分析摆动:记 presub 为前面与当前数之差,lastsub 为当前与后面数之差
思路:
  • 1.正常摆动时,需要 presub 和 lastsub 同为异号
  • 2.出现平路,需要 presub 为0且lastsub不为0时才出现摆动
  • 3.单调坡上出现平路时,注意presub的变化,只有当峰值出现presub才改变;如图中所示,不出现峰值时presub不改变,所以平坡的末端处,presub和lastsub是同号的,不会引起计数变化
cpp 复制代码
class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        //思路一:直接计算峰顶和峰底的个数
        if(nums.size()<=1) return nums.size();
        int curDiff=0;//当前数和后一个数的差值
        int preDiff=0;//前一个数和当前数的差值(初始化为0方便第一个元素计算)
        int sum=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)){
                sum++;
                preDiff=curDiff;//峰值出现后更新prediff
            }
        }
        return sum;
    }
};

53.最大子序和

思路:直接遍历计算数组和,
当数组和大于最大子序和时,更新最大子序和;
当数组和小于等于0时,直接把数组和记录为0,原地开启下一次求和

注意:存在负数,所以最大子序和的初始值为INT_MIN;(头文件为 #include<limits.h>)

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n=nums.size();
        int maxsum=INT_MIN,sum=0;
        for(int i=0;i<n;i++){
            sum+=nums[i];
            if(sum>maxsum)
                maxsum=max(maxsum,sum);//更新子序和
            if(sum<=0)//重新开始求和
                sum=0;
            
        }
        return maxsum;
    }
};

45.跳跃游戏||

思路:求最少跳跃次数,即需要求最大覆盖范围,并且在覆盖范围内再求最大覆盖范围
1.记录最大覆盖范围
2.在最大覆盖范围内更新最大覆盖范围
3.当走到上一次最大覆盖范围的末尾,判断是否到达了终点;
  • 如果没到,则还进行跳跃计数
  • 把当前的最大覆盖范围更新
  • 判断当前最大覆盖范围是否能到达终点,如果能到达直接跳出(因为这一次跳跃已经计数)
cpp 复制代码
class Solution {
public:
    int jump(vector<int>& nums) {
        //思路:在覆盖中寻找跳的最远的
        if(nums.size()==1) return 0;
        int count=0;
        int cur=0,next=0;
        for(int i=0;i<nums.size();i++){
            next=max(next,nums[i]+i);
            if(i==cur){//上一次最大覆盖范围走到末尾
                if(cur!=nums.size()-1){//上一次覆盖范围没有到达终点
                    count++;//进行下一步跳跃计数
                    cur=next;//更新最大覆盖范围
                    if(cur>=nums.size()-1) break;//如果最大覆盖范围大于终点
                }
            }
        }
        return count;
    }
};
相关推荐
??tobenewyorker25 分钟前
力扣打卡第23天 二叉搜索树中的众数
数据结构·算法·leetcode
贝塔西塔42 分钟前
一文读懂动态规划:多种经典问题和思路
算法·leetcode·动态规划
众链网络1 小时前
AI进化论08:机器学习的崛起——数据和算法的“二人转”,AI“闷声发大财”
人工智能·算法·机器学习
1 小时前
Unity开发中常用的洗牌算法
java·算法·unity·游戏引擎·游戏开发
飒飒真编程3 小时前
C++类模板继承部分知识及测试代码
开发语言·c++·算法
GeminiGlory3 小时前
算法练习6-大数乘法(高精度乘法)
算法
熬了夜的程序员3 小时前
【华为机试】HJ61 放苹果
算法·华为·面试·golang
马特说3 小时前
基于随机森林的金融时间序列预测系统:从数据处理到实时预测的完整流水线
算法·随机森林·金融
呆呆的小鳄鱼3 小时前
leetcode:HJ18 识别有效的IP地址和掩码并进行分类统计[华为机考][字符串]
算法·leetcode·华为
艾莉丝努力练剑4 小时前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(五)
c语言·开发语言·数据结构·学习·算法