[豪の算法奇妙冒险] 代码随想录算法训练营第二十七天 | 455-分发饼干、376-摆动序列、53-最大子序和

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


LeetCode455 分发饼干

题目链接:https://leetcode.cn/problems/assign-cookies/description/

文章讲解:https://programmercarl.com/0455.分发饼干.html

视频讲解:https://www.bilibili.com/video/BV1MM411b7cq/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 先进行排序,然后从胃口最小的孩子开始遍历,把满足其胃口要求的最小尺寸饼干给他,直到无法满足或遍历结束,此时得到题解

image-20260112203533242

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int cnt = 0;
        for(int i = 0; i < g.length; i++){
            if(findS(s, g[i])){
                cnt++;
            }else{
                break;
            }
        }
        return cnt;
    }

    public boolean findS(int[] s ,int G){
        for(int i = 0; i < s.length; i++){
            if(s[i] >= G){
                s[i] = -1;
                return true;
            }
        }
        return false;
    }
}

LeetCode376 摆动序列

题目链接:https://leetcode.cn/problems/wiggle-subsequence/description/

文章讲解:https://programmercarl.com/0376.摆动序列.html

视频讲解:https://www.bilibili.com/video/BV17M411b7NS/

​ 先进行相邻元素去重,避免平坡,然后分情况讨论

​ 当list只有一个元素时return1,list只有两个元素时return2,list有三个以上元素再进行下一步的计数

​ list元素有三个以上,则默认头尾两个元素算作两个摆动,cnt从2开始计数,i从list的第二个元素开始遍历到倒数第二个元素,期间若遇到preDiff与curDiff符号不同的情况,则说明来到了拐点,cnt++

image-20260112211434659

class Solution {
    public int wiggleMaxLength(int[] nums) {
        List<Integer> list = new ArrayList<>();
        list.add(nums[0]);
        for(int i = 1; i < nums.length; i++){
            if(nums[i] != nums[i-1]){
                list.add(nums[i]);
            }
        }

        if(list.size() == 1){
            return 1;
        }
        if(list.size() == 2){
            return 2;
        }

        int cnt = 2;
        for(int i = 1; i < list.size()-1; i++){
            int preDiff = list.get(i) - list.get(i-1);
            int curDiff = list.get(i+1) - list.get(i);
            if((preDiff > 0 && curDiff < 0)||(preDiff < 0 && curDiff > 0)){
                cnt++;
            }
        }
        return cnt;
    }
}

LeetCode53 最大子序和

题目链接:https://leetcode.cn/problems/maximum-subarray/description/

文章讲解:https://programmercarl.com/0053.最大子序和.html

视频讲解:https://www.bilibili.com/video/BV1aY4y1Z7ya/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 尽可能的让子数组和大,所以当当前ans为负数时要立即抛弃,从下一个重新开始累加

image-20260112213605072

class Solution {
    public int maxSubArray(int[] nums) {
        int result = Integer.MIN_VALUE;
        int ans = 0;
        for(int i = 0; i < nums.length; i++){
            ans += nums[i];
            if(ans > result){
                result = ans;
            }
            if(ans < 0){
                ans = 0;
            }
        }
        return result;
    }
}
posted @ 2026-01-12 21:38  SchwarzShu  阅读(1)  评论(0)    收藏  举报