代码训练day27贪心算法p1

贪心的本质是选择每一阶段的局部最优,从而达到全局最优

贪心算法一般分为如下四步:

  • 将问题分解为若干个子问题
  • 找出适合的贪心策略
  • 求解每一个子问题的最优解
  • 将局部最优解堆叠成全局最优解

1.分发饼干

先将饼干数组和小孩数组排序。

然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量

java 复制代码
class Solution {
    public int findContentChildren(int[] g, int[] s) {
        // 1. sort
        Arrays.sort(g);
        Arrays.sort(s);
        int count = 0;
        int sindex = s.length - 1;
        // 倒序遍历小孩数组,如果排序后饼干最大满足该小孩胃口,count++,sindex--;
        for (int i = g.length - 1; i >= 0; i--) {
            if (sindex >= 0 && s[sindex] >= g[i]) {
                count++;
                sindex--;
            }
        }
        return count;
    }
}

2.摆动序列

考虑三种情况:

  1. 情况一:上下坡中有平坡
  2. 情况二:数组首尾两端
  3. 情况三:单调坡中有平坡
java 复制代码
class Solution {
    public int wiggleMaxLength(int[] nums) {
        if (nums.length <= 1) {
            return nums.length;
        }
        int curDiff = 0;// 当前差值
        int preDiff = 0;// 上一个差值
        int count = 1;
        for (int i = 1; i < nums.length; i++) {
            // 当前差值
            curDiff = nums[i] - nums[i - 1];
            //如果当前差值和上一个差值为一正一负
            //等于0的情况表示初始时的preDiff
            if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) {
                count++;
                preDiff = curDiff;
            }
        }
        return count;
    }
}

3.最大子序列和

(1)遍历记录最大子序列和

(2)发现前一段子序列和为负,要更新子序列和起始位置

java 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        if (nums.length == 1) return nums[0];
        int sum = Integer.MIN_VALUE;
        int count = 0;
        for (int i = 0; i < nums.length; i++) {// 贪心,记录区间累计最大值
            count += nums[i];
            sum = Math.max(sum, count);
            if (count <= 0) count = 0; // 重置最大子序列和起始位置,如果count < 0,要去掉之前的序列。
        }
        return sum;
    }
}
相关推荐
董董灿是个攻城狮1 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员8 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish8 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱9 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript