代码随想录算法训练营第三十一天|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;
    }
}
相关推荐
盼海34 分钟前
排序算法(五)--归并排序
数据结构·算法·排序算法
Theodore_10224 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
网易独家音乐人Mike Zhou4 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
冰帝海岸5 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象5 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了5 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic6 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王6 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康6 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud