贪心算法总结

一、基本概述

本质:

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

难点:

​ 唯一的难点就是如何通过局部最优,推出整体最优。

做题方法:

​ 毫无套路可言,最好用的策略就是多举几个测试用例,看一下贪心是否合适。

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

二、做题

第455题 分发饼干

一个数组表示 每个小孩对应的胃口

一个数组表示 每块饼干对应的尺寸

大部分情况下处理两个数组都会想到用两层 for 循环,但是本题中,可以只用一层 for 循环,

用 for 循环来遍历小孩对应的胃口,然后定义一个 index 变量 ,来控制饼干数组的遍历,这样可以大大的简化逻辑。

第376题 摆动序列

时间复杂度O(n),空间复杂度O(1)

这道题有点难了。。。

图示可以根据所给数组画折线图表示,折线图可以很清楚的看清整个过程的走势,

局部最优:删除单调坡度上的节点,但是单调坡度两端的节点不删,那么这个坡度就可以有两个局部峰值。

整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列。

局部最优推出全局最优,并举不出反例,那么试试贪心算法。

贪心其实要从直觉出发,

比如目前要增加,那么我肯定是想把它增的高高的,这样随便随便再来一个数就会有比较大的概率是符合减的条件,

同理如果要减少,那么也是尽可能的降到足够的低,这样随便再来一个数就会有比较大的概率
### 贪心算法的核心思想 贪心算法是一种通过逐步做出局部最优的选择来解决问题的方法,其目标是在每一步都选择当前情况下最好的选项,从而期望最终得到全局最优解[^2]。然而需要注意的是,这种策略并不总是能够保证获得真正的全局最优解,因此在应用时需谨慎验证。 #### 局部最优与整体最优的关系 贪心算法的关键在于如何定义“局部最优”。例如,在找零钱问题中,优先使用面额较大的钞票可以减少所需钞票的数量,这是一种直观的局部最优策略[^2]。但是并非所有问题都能如此简单地解决;某些复杂场景下可能需要更深入的理解才能正确设计出有效的贪心规则。 #### 学习过程中的挑战与成长 对于初学者而言,掌握贪心算法可能会遇到一定困难。正如一位学习者所描述,“刚开始都不怎么会做”,这表明初次接触此类方法时常感到困惑甚至无从下手[^1]。面对这些问题,可以通过观看在线教程、查阅参考资料以及与其他同学交流等方式逐渐积累经验并形成自己的思考模式。“慢慢地才对贪心算法有了一些规律上的总结”,说明持续的努力加上实践是非常重要的环节之一[^1]。 以下是基于C++实现的一个典型例子——跳跃游戏(Jump Game),它展示了如何利用贪心思路高效求解特定类型的问题: ```cpp #include <iostream> using namespace std; int canJump(int* nums, int size){ int lastPos = size - 1; for (int i = size - 1; i >= 0; --i){ if (i + nums[i] >= lastPos){ lastPos = i; } } return lastPos == 0 ? 1 : 0; } int main(){ int a[] = {2,3,1,1,4}; cout << canJump(a,sizeof(a)/sizeof(*a))<< endl; } ``` 此程序片段实现了这样一个功能:给定一系列非负整数表示每个位置的最大跳远距离,请判断是否可以从第一个位置出发到达最后一个位置。这里采用逆向思维的方式,不断更新最远可达到的位置直到起点为止[^3]。 ### 结论 综上所述,虽然贪心算法看似简单易懂,但在实际运用过程中仍需仔细考量各种因素以确保解决方案的有效性和准确性。随着不断的练习和探索,人们不仅可以提升对该技术的认识水平,而且还能培养良好的编程习惯和技术素养。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值