贪心法用来解可由局部最优推出全局最优的问题。
# 基础
贪心法一般步骤:
- 将问题分解为子问题
- 找出适合的贪心策略
- 求子问题的最优解
- 局部最优堆叠为全局最优
# 实践
# 分发饼干
- 从最大的开始,依次试图满足孩子的胃口
1 | |
# 摆动序列
- 依次判断前后差值,当差值异号时计入统计,统一拓展至边界值,[2, 5]可以看做[2, 2, 5]是等价的,序列均为2。
1 | |
# 最大子序和
- 暴力法
1 | |
- 贪心,负数总会拉低总和,如果连续和已经为负数就应该立刻放弃。
1 | |
# 买卖股票的最佳时机 II
- 累加所有差为正的区间
1 | |
# 跳跃游戏
- 计算下标+数值的最大值,如果下标大于最大值说明无法到达
1 | |
- 考虑覆盖,如果max已覆盖最后一个index,则直接返回
1 | |
# 跳跃游戏II
- 计算下标+数值的最大值,当当前下标不是最后一个下标时,最大步数总要+1,而两段部分重叠的区间,总可以2步走完。
1 | |
# K 次取反后最大化的数组和
- 首先按绝对值从大到小排序,把K的次数用在翻转负数上,如果全部翻转完K>0,则全部用在绝对值最小的值上
1 | |
# 加油站
- 贪心,如果gas总量小于cost则不能跑完,否则一定存在起始点,从0开始累加gas-cost差,如果累加和小于0,则之前站点不能作为起始站点,累加和清零,起始点一定出现在当前点或之后。
1 | |
# 分发糖果
- 模拟暴力法,模拟发糖过程,如果当前评分低于前值,从当前位置向前补发糖果
1 | |
- 贪心,先满足右边,再满足左边,满足左边时右边的条件也不能被破坏
1 | |
# 柠檬水找零
- 模拟法,优先给10块
1 | |
# 根据身高重建队列
- 先按身高从大到小排列,身高相同时,k按从小到大排列,再按k的序号顺序插入即可
1 | |
- 数组shift改成copy,好像并没有变快很多
1 | |
# 用最少数量的箭引爆气球
- 先按气球左边界从小到大排序,再逐一引爆气球,如果当前气球的右边界小于前一个气球的左边界,则是重叠的,可以引爆,此时合二为一,取两者交集(右边界中较小的),反之,需要一只箭。
1 | |
# 无重叠区间
- 先按左边界从小到大排序,再逐一判断是否交叠,如果当前左边界小于右边界,说明发生交叠,必须移除一个,此时选择右边界更小的局部最优解,尽量避免和其他区间交叠。
1 | |
# 划分字母区间
- 先遍历找到每个字母的最远边界,再从头开始,如果当前字母的最远边界大于右边界,则将右边界更新为当前字母最远边界,如果遍历index等于右边界,说明右边界内所有值的最远程度均小于等于右边界,形成一个分割点。
1 | |
# 合并区间
- 同区间重叠
1 | |
# 单调递增的数字
- 贪心策略,如果前一位较大,则将前一位减一,当前位置为9。
1 | |
# 监控二叉树
- 贪心策略,为了最小化摄像头数量,叶子节点不放,根节点最好也不放,其余节点隔两个放一个,从叶子节点开始后序遍历。节点状态分为0无覆盖,1有摄像头,2有覆盖三种,空节点默认为有覆盖。
处理逻辑分为:
- 左右节点都有覆盖则返回无覆盖
- 左右至少有一个无覆盖则放置摄像头
- 左右节点至少有一个摄像头则返回有覆盖
- 根节点如果无覆盖则放置摄像头
1 | |