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;
    }
};
相关推荐
小刘|27 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
jjyangyou32 分钟前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计
van叶~1 小时前
算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
c++·算法
简简单单做算法1 小时前
基于Retinex算法的图像去雾matlab仿真
算法·matlab·图像去雾·retinex
云卓SKYDROID1 小时前
除草机器人算法以及技术详解!
算法·机器人·科普·高科技·云卓科技·算法技术
半盏茶香1 小时前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏
徐子童2 小时前
双指针算法习题解答
算法
想要打 Acm 的小周同学呀2 小时前
LRU缓存算法
java·算法·缓存
劲夫学编程3 小时前
leetcode:杨辉三角
算法·leetcode·职场和发展
毕竟秋山澪3 小时前
孤岛的总面积(Dfs C#
算法·深度优先