代码训练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;
    }
}
相关推荐
linux-hzh2 小时前
百日算法修炼 · Day 05
java·算法
paopaokaka_luck2 小时前
基于springboot3+vue3的云南本土影视文旅推荐平台(协同过滤算法、Echarts图形化分析)
前端·spring boot·学习·算法·echarts·mybatis
Ivanqhz3 小时前
泰勒展开(Taylor Expansion)
算法·决策树·机器学习·集成学习
zander2584 小时前
34. 在排序数组中查找元素的第一个和最后一个位置:用两个边界定位区间
数据结构·算法·leetcode
郑州光合科技余经理9 小时前
代驾系统架构拆解:订单链路、权限组织与私有化源码交付
开发语言·后端·算法·架构·系统架构·uni-app·php
To_OC11 小时前
LC 35 搜索插入位置:二分查找谁都会,边界条件谁写谁懵
javascript·算法·leetcode
码哥DFS12 小时前
二叉树的直径
开发语言·javascript·算法
营养充电站15 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
人工智能·算法·docker·jupyter
技术小黑15 小时前
RNN算法实战系列05 | 天气预测
人工智能·rnn·算法