代码训练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;
    }
}
相关推荐
喜欢吃燃面几秒前
C++算法竞赛:位运算
开发语言·c++·学习·算法
项目申报小狂人12 分钟前
算法应用上新!自适应更新策略差分进化算法求解球形多飞行器路径规划问题,附完整MATLAB代码
开发语言·算法·matlab
PAK向日葵6 小时前
【算法导论】PDD 0817笔试题题解
算法·面试
地平线开发者9 小时前
ReID/OSNet 算法模型量化转换实践
算法·自动驾驶
地平线开发者9 小时前
开发者说|EmbodiedGen:为具身智能打造可交互3D世界生成引擎
算法·自动驾驶
星星火柴93610 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
艾莉丝努力练剑11 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
C++、Java和Python的菜鸟12 小时前
第六章 统计初步
算法·机器学习·概率论
Cx330❀12 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法