代码随想录算法训练营第三十一天|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;
    }
}
相关推荐
毕设源码-钟学长4 分钟前
【开题答辩全过程】以 高校体育赛事管理系统的设计与实现为例,包含答辩的问题和答案
java
爱喝可乐的老王4 分钟前
机器学习监督学习模型----KNN
人工智能·算法·机器学习
闪电麦坤955 分钟前
Leecode热题100:环形链表(链表)
数据结构·链表·leecode
WBluuue8 分钟前
AtCoder Beginner Contest 441(ABCDEF)
c++·算法
Remember_99312 分钟前
【LeetCode精选算法】双指针专题一
java·数据结构·算法·leetcode
未来龙皇小蓝12 分钟前
策略模式:Spring Bean策略与枚举 Lambda策略
java·windows·spring boot·spring·策略模式
多米Domi01113 分钟前
0x3f 第36天 外卖8,9,树
数据结构·python·算法·leetcode
jonyleek16 分钟前
开源APS排产系统,出货计划如何成为企业降本增效的关键?
算法·开源·私有化部署·软件开发·生产排产·aps排产系统
hetao173383717 分钟前
2026-01-16~19 hetao1733837 的刷题笔记
c++·笔记·算法
LiRuiJie20 分钟前
从OS层面深入剖析JVM如何实现多线程与同步互斥
java·jvm·os·底层