Leetcode 每日一题
题目链接:514. 自由之路
难度: 困难
解题思路: 这道题乍一看,可以选择用动态规划或者BFS来求解。本文使用BFS来进行解答。注意到题中有一个最小的到路径。所以我们可以加入优先队列进行优化,用这个路径花费来对BFS中的队列进行排序,路径长度越小越先出队列。但是这样做还是不够快。会卡在如下样例:

"xrrakuulnczywjs"
"jrlucwzakzussrlckyjjsuwkuarnaluxnyzcnrxxwruyr"

所以我们还需要进行优化。我们需要加入一个visit数组来记录从key的i位置到ring的j位置的最小值(最小花费)。若当前又计算到了这个节点并且这个值还大于等于最小值,我们就抛弃这点,不进入队列。

本题使用的优先队列有个自定义的priority 。 可以直接将当前的花费作为这个优先级。
题解:

import heapq# 定义优先队列
class PQ:def __init__(self):self._queue = []self._index = 0        def queue_push(self, item, priority):heapq.heappush(self._queue, (priority, index, item)) # 自定义排序,当前花费越越靠后self._index += 1def queue_pop(self):return heapq.heappop(self._queue)[-1]def is_empty(self):return len(self._queue) != 0class Solution:def findRotateSteps(self, ring: str, key: str) -> int:lenr = len(ring)lenk = len(key)def bfs():# [key到达的位置, ring到达的位置, 当前花费]pq = PQ()pq.queue_push([0, 0, 0], 1)# visit数组表示从key的i位置到ring的j位置的最小值。大于等于最小值的不考虑visit = [[] for i in range(lenk)]for i in range(lenk):for j in range(lenr):visit[i].append(0x3f3f3f3f)while pq.is_empty():node = pq.queue_pop()# print(node)# 当前遍历到key的最后,找到结果了if node[0] == lenk:return node[-1]# 顺时针for i in range(node[1], lenr):if ring[i] == key[node[0]]:#print(node)priority = node[2] + i - node[1] + 1if visit[node[0]][i] <= priority:continuevisit[node[0]][i] = prioritypq.queue_push([node[0] + 1, i, priority], priority)for i in range(0, node[1]):if ring[i] == key[node[0]]:priority = node[2] + i + (lenr - node[1]) + 1if visit[node[0]][i] <= priority:continuevisit[node[0]][i] = prioritypq.queue_push([node[0] + 1, i, priority], priority)      # 逆时针for i in reversed(range(0, node[1])):if ring[i] == key[node[0]]:priority =  node[2] + node[1] - i + 1if visit[node[0]][i] <= priority:continuevisit[node[0]][i] = prioritypq.queue_push([node[0] + 1, i, priority], priority)for i in reversed(range(node[1], lenr)):if ring[i] == key[node[0]]:priority = node[2] + node[1] + (lenr - i) + 1if visit[node[0]][i] <= priority:continuevisit[node[0]][i] = prioritypq.queue_push([node[0] + 1, i, priority], priority)res = bfs()return res

【Leetcode 每日一题】514. 自由之路(BFS+优先队列)相关推荐

  1. leetcode:514. 自由之路

    题目来源 leetcode:514. 自由之路 题目描述 class Solution {public:int findRotateSteps(string ring, string key) {} ...

  2. leetcode每日刷题计划-简单篇day8

    leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...

  3. Leetcode每日一题:171.excel-sheet-column-number(Excel表列序号)

    思路:就是168题的反命题,进制的方式完美解决: Leetcode每日一题:168.excel-sheet-column-title(Excel表名称) class Solution {public: ...

  4. 【LeetCode每日一题】1723. 完成所有工作的最短时间

    [LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...

  5. leetcode每日一题--雀巢原理;抽屉算法;Quorum机制;分布式应用

    leetcode每日一题 539. 最小时间差 示例 1: 输入:timePoints = ["23:59","00:00"] 输出:1 示例 2: 输入:ti ...

  6. LeetCode每日一题——1812. 判断国际象棋棋盘中一个格子的颜色

    LeetCode每日一题系列 题目:1812. 判断国际象棋棋盘中一个格子的颜色 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个坐标 coordinates ...

  7. 【LeetCode每日一题】——109.有序链表转换二叉搜索树

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[题目提示] 七[解题思路] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 二叉树 二[题 ...

  8. leetcode每日一题·救生艇问题(Python)

    leetcode每日一题·救生艇问题(Python) 问题描述 题目入口 题目思路 首先分析问题,一个船最多坐两人,因此我们可以把这个问题看作两两组合的问题,并且如果最重的那个人和最轻的人加起来大于l ...

  9. LeetCode每日一题——904. 水果成篮

    LeetCode每日一题系列 题目:904. 水果成篮 难度:普通 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整 ...

最新文章

  1. Qt之对话框设计——淡入淡出效果
  2. lombok 中的@Data注解
  3. 网站页面HTML代码优化需要注意的问题
  4. 数据结构-队列之循环队列
  5. mysql增加修改字段
  6. Tech·Ed 2006中国 实况报道
  7. 李晓菁201771010114《面向对象程序设计(java)》第十三周学习总结
  8. 74.iptables规则备份和恢复,firewalld
  9. 一文学懂经典算法系列之:直接选择排序(附讲解视频)
  10. 22fall 游戏/数字媒体/人机交互DIY留学申请经验贴
  11. go-sqlite3 “database is locked”问题解决方案
  12. Word如何在表格里面插入行或者列
  13. 2021年年4月证券从业资格考试《金融市场基础知识》真题(考生回忆 版)
  14. 微信小程序--个人主页的制作
  15. 在MVC项目中设置启动页
  16. 2013硕士毕业生薪资待遇
  17. IOS开发使用@IBInspectable给控件添加额外属性
  18. JVM内存模型以及JVM内存模型图
  19. 玩转可视化图表之矩形树图
  20. 《学会提问》02| 论题和论证

热门文章

  1. linux shell 删除key \xAC\xED\x00\x05t\x00\x04${key} 序列化16进制
  2. 虚拟机运行macOS10.15Catalina拓展apfs卷宗(拓展分区)
  3. Howler 音频资源跨域提示html5
  4. 74ls48电子集成块
  5. 推荐系统_各种方法的损失计算过程
  6. zynq 7000 的流水灯实验
  7. GTD时间管理理念和德鲁克时间管理理念的异同
  8. y7000电脑键盘使用不了_[电脑]致敬Cherry G80——J80 R2 87客制化键盘使用评测
  9. AMBER:使用Cpptraj计算RMSD 以及使用中遇到的问题
  10. AP侧,BP侧如何理解?