代码随想录算法训练营第三十一天|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;
    }
}
相关推荐
今天多喝热水2 分钟前
SpEL(Spring Expression Language) 表达式
java·后端·spring
wasp5203 分钟前
Hudi 客户端实现分析
java·开发语言·人工智能·hudi
学海无涯书山有路3 分钟前
Android LiveData + MVVM 新手入门教程(基于 XML+Java)
android·xml·java
Hello.Reader4 分钟前
Flink 2.0 从 flink-conf.yaml 到 config.yaml 的正确打开方式(含迁移与最佳实践)
java·前端·flink
李慕婉学姐5 分钟前
【开题答辩过程】以《基于uni-app的手账记录小程序的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·小程序·uni-app
福大大架构师每日一题6 分钟前
milvus v2.6.9 发布:支持主键搜索、段重开机制、日志性能全面提升!
android·java·milvus
独自破碎E6 分钟前
【滑动窗口】最长无重复子数组
java·开发语言
GIOTTO情7 分钟前
Infoseek 媒介投放系统技术实现:基于与辉同行风波的风险防控架构设计
java·架构·媒体
木井巳7 分钟前
【Java】数据类型及运算符重点总结
java·开发语言
码农水水7 分钟前
美团Java面试被问:Netty的ByteBuf引用计数和内存释放
java·开发语言·数据库·mysql·算法·面试·职场和发展