前缀树
遍历字符串数组所有字符串,使用字符串来创建路径,如图所示:
每个点上的数据有:
int pass(通过了多少次)
int end(多少个字符串的终止节点)
vector<Node*> nexts(nullptr表明没有该路)使用哈希表代替结构也可以
沿途p++,最后e++
贪心算法
不从整体最优上加以考虑,所做的是在某种意义上的局部最优,从而达到整体最优。
不需要纠结去进行证明,进行策略制定,使用对数器来验证算法的正确性。
贪心策略技巧:
1. 根据某标准建立比较器排序
2. 根据某标准建立比较器来组成排序
常规贪心策略:
给一个小写字母字符串数组,决定拼接顺序使得最后拼接的字符串字典序最小
可以将一个字符串当作26进制数,长度不同需要在后补0至相同即可比较。数字小的字典序也就小。
策略:a.b<=b.a(.表示连接两个字符串),如果满足则a放前面,否则b放前面
策略:(哈夫曼编码问题——一堆数丢进小根堆里,每次拿出两个数结合过后的数丢进小根堆,周而复始)
策略:小根堆按花费排序(锁住的项目),然后将所有花费小于等于我当前资金的项目弹出,压进按利润排序的大根堆(解锁的项目)。大根堆弹出,更新我的资金,继续解锁项目,周而复始即可。
一个数据流中,随时可以取得中位数
策略:准备一个大根堆和一个小根堆,第一个数字直接进大根堆,
1. cur<=大根堆堆顶,如果是,当前数字入大根堆,若不是,入小根堆
2. 看看两个堆的大小,若相差个数到达了2,则较大堆顶弹出进较小的堆
3. 最后尺寸相同,堆顶平均数为中位数,否则较大堆的堆顶元素为中位数
N皇后问题
暴力尝试
使用一个数组,arr[i]表明了第i行得皇后放在了第几列,需要从左到右依次进行放置。
深度遍历,尝试所有可能性,最后返回合法可能性数即可。
时间复杂度:O(N^N)
可以做常数时间上的优化:(位运算加速)