基础算法7-贪心算法

贪心算法:
在某一个标准下(自己提供的贪心策略),优先考虑最满足标准的样本,最后考虑最不满足标准的样本,最终得到的一个答案的算法,叫做贪心算法。

也就是说,不从整体上最优上加以考虑,所做出的是在某种意义上的局部最优解。
局部最优 -?-> 整体最优

题目一:
一些项目要占用一个会议室宣讲,会议室不能同时容纳2个项目的宣讲。给你每一个项目开始的时间和结束的时间(给你一个数组,里面是一个个具体的项目),你来安排宣讲的日期,要求会议室进行的宣讲场次最多。返回这个最多的宣讲场次。

解法:
策略1 把持续时间最短的先安排 --不对
策略2 安排开始时间最早的项目 --不对
策略3 结束时间早的项目先安排 – 对 全局最优解
自己脑补各种贪心策略,用 小数据量暴利尝试的方式 选择一个最好的贪心策略。

题目二:
给定一个字符串类型的数组strs, 找到一种拼接方式,使得把所有字符串拼接起来后形成字符串具有最小的字典序。
(字典序:两个单词 谁的单词放在前面 他们的值就小。 如果两个字符串长度一样 按照数值直接比,abc < cde, 长度不等时 短的后面补0 再比较。)
解法:
策略1: 按照单个字符串 最小字典序进行排序拼接–不对 比如【‘ba’,‘b’】–》bab < bba
策略2: str1, str2 结合起来看 谁作为前缀 字典序更小,谁就放前面。str1+str2 < str2+str1那么str1放前面。

贪心策略 一定是单调的 有传递的。

题目三:
一块金条切分成两半,是需要花费和长度数值一样的铜板的,比如长度为20的金条,不管切成长度多大的两半,都要花费20个铜板。
一群人想整分整块金条,怎么分最省铜板?

例如:给定数组{10,20, 30},代表一共三个人,整块金条长度为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铜板。
输入一个数组,返回分割的最小代价。

策略:把数组调整成小根堆,每次弹出2个最小的,计算和,然后把和放回去。然后继续弹回最小的,计算和 再继续弹出最小的。 — 哈夫曼编码

比如:数组 7 5 3 2 1 6 7. 总共31,
第一次弹出1 2 -->3. 放进去 7 5 3 3 6 7
第二次弹出3 3–>6. 放进去 7 5 6 6 7
第三次弹出5 6 -->11. 放进去7 6 11 7
第四次弹出6 7 -->13 .放进去13 11 7
第五次弹出11 7 --> 18.放进去13 18.
最后31 --> 先切分成13 + 18 两块。 在分别继续切分。

贪心策略 采用 哈夫曼编码(顺序无关,代价为 求和)

题目四:
2个正数数组,cost 和profits, cost[i]表示i号项目的花费,profits[i]表示第i个项目的利润. k是串行的最多做的k个项目,m表示你的初始资金。你每做完一个项目,马上获得的收益 可以支持你去做下一个项目。输出 你最好获得的最大钱数。

解法:
首先把所有的项目 根据花费 做一个小根堆。 所有小于等于m的项目弹出,放入 利润 堆中并且调整成 利润的大根堆。

题目五:
一个数据流中,随时可以取得中位数。

解法: 准备一个大根堆,和一个小根堆。 大根堆里面放所有小的数,小根堆里面放所有大的数。
新来的一个数,如果大根堆为空,则把数据放到大根堆,然后新的数时,

  1. 前缀树
发布了28 篇原创文章 · 获赞 5 · 访问量 4322

猜你喜欢

转载自blog.csdn.net/m0_37531129/article/details/104135848