代码训练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;
    }
}
相关推荐
小O的算法实验室1 小时前
2025年SEVE SCI2区,具有局部和全局参数自适应差分进化算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
LGL6030A5 小时前
算法题实战积累(3)——方块转换(C语言)
c语言·算法
一条星星鱼5 小时前
深度学习是如何收敛的?梯度下降算法原理详解
人工智能·深度学习·算法
长路归期无望8 小时前
C语言小白实现多功能计算器的艰难历程
c语言·开发语言·数据结构·笔记·学习·算法
MobotStone9 小时前
AI训练的悖论:为什么越追求准确率越会产生幻觉?
算法
怀旧,10 小时前
【C++】26. 智能指针
开发语言·c++·算法
Haooog10 小时前
654.最大二叉树(二叉树算法)
java·数据结构·算法·leetcode·二叉树
Swift社区10 小时前
LeetCode 392 判断子序列
算法·leetcode·职场和发展
芒果量化11 小时前
ML4T - 第7章第8节 利用LR预测股票价格走势Predicting stock price moves with Logistic Regression
算法·机器学习·线性回归
东方芷兰11 小时前
JavaWeb 课堂笔记 —— 20 SpringBootWeb案例 配置文件
java·开发语言·笔记·算法·log4j·intellij-idea·lua