代码随想录算法训练营第三十一天|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 小时前
14、C 语言进阶:函数指针、typedef、二级指针、const 指针
c语言·开发语言·算法·排序算法·学习方法
yagamiraito_3 小时前
757. 设置交集大小至少为2 (leetcode每日一题)
算法·leetcode·go
星释4 小时前
Rust 练习册 57:阿特巴什密码与字符映射技术
服务器·算法·rust
星期天24 小时前
3.0 C语⾔内存函数:memcpy memmove memset memcmp 数据在内存中的存储:整数在内存中的存储 ⼤⼩端字节序和字节序判断
c语言·数据结构·进阶·内存函数·数据内存存储
无敌最俊朗@4 小时前
力扣hot100-141.环形链表
算法·leetcode·链表
向着光芒的女孩5 小时前
【IDEA】关不了的Proxy Authentication弹框探索过程
java·ide·intellij-idea
Filotimo_6 小时前
Spring Boot 整合 JdbcTemplate(持久层)
java·spring boot·后端
李慕婉学姐6 小时前
【开题答辩过程】以《“饭否”食材搭配指南小程序的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·spring·小程序
WWZZ20256 小时前
快速上手大模型:深度学习10(卷积神经网络2、模型训练实践、批量归一化)
人工智能·深度学习·神经网络·算法·机器人·大模型·具身智能
abments7 小时前
pgsql timestamp without time zone > character varying解决方案
java