代码随想录算法训练营第三十一天|455.分发饼干、376. 摆动序列、53. 最大子序和

455.分发饼干

题解(贪心思路1:先满足大胃口):
java 复制代码
class Solution {
    //贪心思路1:先满足大胃口
    public int findContentChildren(int[] g, int[] s) {
        //贪心算法必须先排序
        Arrays.sort(g);
        Arrays.sort(s);
        int result = 0;
        int start = s.length - 1;
        //胃口无回溯遍历,一直往前遍历;循环饼干进行投喂
        for(int index = g.length - 1; index >= 0; index--){
            //当饼干能满足胃口
            if(start >= 0 && g[index] <= s[start]){
                start--;
                result++;
            }
        }
        return result;
    }
}
题解(贪心思路2:先满足小胃口):
java 复制代码
class Solution {
    //贪心思路2:先满足小胃口
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int result = 0;
        int start = 0;
        for(int i = 0; i < s.length && start < g.length; i++){
            //当饼干能够满足胃口,结果+1
            if(s[i] >= g[start]){
                start++;
                result++;
            }
        }
        return result;
    }
}

376. 摆动序列

题解(摆动序列差值法):
java 复制代码
class Solution {
    //摆动序列差值法
    public int wiggleMaxLength(int[] nums) {
        //当只有一个元素时默认有1个摆动,没有元素则返回0个摆动
        if(nums.length <= 1){
            return nums.length;
        }
        //记录当前元素的当前差值和上次差值,二者以双指针形式进行遍历
        int curDiff = 0;
        int preDiff = 0;
        //记录摆动的个数
        int result = 1;
        //因为从第二个元素开始才有差值,所以下标从1开始
        for(int i = 1; i < nums.length; i++){
            //记录当前差值
            curDiff = nums[i] - nums[i - 1];
            //Debug点:只有当curDiff发生变化时才会进行指针交替操作
            //防止出现在上坡或者下坡过程中发生摆动的错误识别

            //Debug点:注意两种平坡情况,不能只顾着双指针交替
                //1、单调中的平坡
                //2、上下坡中的平坡
                
            //如果当前差值和上一个差值为一正一负则说明找到了一个摆动
            //若curDiff为0说明当前正在平坡中,不需要更新preDiff
            //直到curDiff不为零时,更新preDiff,可以越过这个上下坡过程中的平坡
            if((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)){
                result++;
                preDiff = curDiff;
            }
        }
        return result;
    }
}

53. 最大子序和

题解(正收益贪心思想):
java 复制代码
class Solution {
    //运用收益思想:
        //只有正数才能对最后结果带来增益,只要是负数就会降低最后的增益
    //又因为是连续的数组,所以在这里的思想就是:
        //不断收集正收益的sum,遇见负收益就忽略它,重新开始计算收益
    public int maxSubArray(int[] nums) {
        //当数组长度为1时,本身就是最大收益,直接返回
        if(nums.length == 1){
            return nums[0];
        }
        //因为sum要记录当前序列的最大值,所以这里初始化为最小值
        int sum = Integer.MIN_VALUE;
        //记录当前序列的和
        int count = 0;
        for(int i = 0; i < nums.length; i++){
            count += nums[i];
            //sum始终更新为当前序列的最大值
            sum = Math.max(sum, count);
            if(count <= 0){
                //debug点:是负收益,而不是遇见负值,二者要做区分

                //若当前为负收益元素,则重置当前序列和为0,重新开始收益
                count = 0;
            }
        }
        return sum;
    }
}
相关推荐
Uluoyu18 小时前
word、pdf文档内容提取工具类
java·pdf·word
自由的疯19 小时前
java 怎么判断事务有无提交成功
java·后端·架构
做科研的周师兄19 小时前
【机器学习入门】7.4 随机森林:一文吃透随机森林——从原理到核心特点
人工智能·学习·算法·随机森林·机器学习·支持向量机·数据挖掘
流星白龙19 小时前
【Qt】3.认识 Qt Creator 界面
java·开发语言·qt
机灵猫19 小时前
深入理解 Java 类加载与垃圾回收机制:从原理到实践
java·开发语言
Sunsets_Red19 小时前
差分操作正确性证明
java·c语言·c++·python·算法·c#
QZ_orz_freedom19 小时前
学习笔记--文件上传
java·笔记·学习
焰火199919 小时前
[Java][SpringBoot]集成Redis实现Session共享
java·redis
荣淘淘19 小时前
互联网大厂Java求职面试全景实战解析(涵盖Spring Boot、微服务及云原生技术)
java·spring boot·redis·jwt·cloud native·microservices·interview
超龄超能程序猿19 小时前
Spring AI Alibaba 与 Ollama对话历史的持久化
java·人工智能·spring