3.6 KiB
贪心算法
贪心算法
- 1)最自然智慧的算法
- 2)用一种局部最功利的标准,总是做出在当前看来是最好的选择
- 3)难点在于证明局部最功利的标准可以得到全局最优解
- 4)对于贪心算法的学习主要以增加阅历和经验为主
贪心求解的标准过程
- 1,分析业务
- 2,根据业务逻辑找到不同的贪心策略
- 3,对于能举出反例的策略直接跳过,不能举出反例的策略要证明有效性这往往是特别困难的,要求数学能力很高且不具有统一的技巧性
贪心算法的解题套路
- 1,实现一个不依靠贪心策略的解法X,可以用最暴力的尝试
- 2,脑补出贪心策略A、贪心策略B、贪心策略C...
- 3,用解法X和对数器,用实验的方式得知哪个贪心策略正确
- 4,不要去纠结贪心策略的证明
贪心算法常见问题
最小字典序
给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中,字典序最小的结果。 a.b<b.a并且b.c<c.b 得到a.c<c.a,比较的传递性。
分割金条
分割金条,60长度分成10、20、30。一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的金条,不管怎么切,都要花费20个铜板。 一群人想整分整块金条,怎么分最省铜板?
例如,给定数组{10,20,30},代表一共三个人,整块金条长度为60,金条要分成10,20,30三个部分。如果先把长度60的金条分成10和50,花费60; 再把长度50的金条分成20和30,花费50;一共花费110铜板。但如果先把长度60的金条分成30和30,花费60;再把长度30金条分成10和20, 花费30;一共花费90铜板。
输入一个数组,返回分割的最小代价。暂不考虑切割的顺序,如果考虑切割顺序需要使用动态规划和四边形不等式。
暴力尝试,双层循环将i和j合并,递归得到花费,最后将最小的花费返回。
将所有分割后的长度放入小根堆,每次获取两个长度相加然后放回小根堆,重复直到小根堆只剩一个元素。 每次都切割最大长度的反例97、98 和 100、99。正确操作是第一次切割成100+99和98+97,而不是切割成100和99+98+97。反例的证明就是哈夫曼编码。
点灯
给定一个字符串str,只由‘X’和‘.’两种字符构成。‘X’表示墙,不能放灯,也不需要点亮。‘.’表示居民点,可以放灯,需要点亮。如果灯放在i位置,可以让i-1,i和i+1三个位置被点亮。返回如果点亮str中所有需要点亮的位置,至少需要几盏灯。
安排会议室
一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲。给你每一个项目开始的时间和结束的时间,你来安排宣讲的日程,要求会议室进行的宣讲的场次最多。返回最多的宣讲场次。
IPO
输入: 正数数组costs、正数数组profits、正数K、正数M costs[i]表示i号项目的花费 profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润) K表示你只能串行的最多做k个项目 M表示你初始的资金 说明: 每做完一个项目,马上获得的收益,可以支持你去做下一个项目。不能并行的做项目。 输出:你最后获得的最大钱数。