算法笔记(八)—— 前缀树和贪心算法

前缀树

遍历字符串数组所有字符串,使用字符串来创建路径,如图所示:

每个点上的数据有:

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)

可以做常数时间上的优化:(位运算加速)

第51题 N皇后_,国际象棋的棋盘大小是 * 的,棋盘上有n个皇后,按照国际象的规则,皇后是可以攻击同_逮到647了的博客-CSDN博客icon-default.png?t=N176https://blog.csdn.net/rygy_/article/details/126950116?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167669397416800184190988%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=167669397416800184190988&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-126950116-null-null.blog_rank_default&utm_term=N%E7%9A%87%E5%90%8E&spm=1018.2226.3001.4450

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值