leetcode 752. Open the Lock | 752. 打开转盘锁(BFS)
题目
https://leetcode.com/problems/open-the-lock/
题解
先写了个 DFS,超时了。
看了下 Related Topics,提示说应该是 BFS。这已经不是第一次遇到 BFS 可以、DFS 超时的题目了。
总结了一下,对于这种可以用 DFS/BFS 求最短路径的题目,优先选择 BFS,因为你到达目标的可能性有超级多种,而大多数路线都走了很多弯路,去遍历它们都是无用功。用 BFS 的话,从 step=1 开始逐渐递增,在 step 受限的情况下,只要到达了目标,当前 step 一定是最短的 step。
另外,本题可以使用 智能算法(只是想到了,没有尝试过)(遗传/蚁群) / 启发式搜索(答案提到了,例如 A*)来做,作为拓展思路,本文不作实现。
class Solution {public int openLock(String[] deadends, String target) {int t = Integer.parseInt(target);Set<Integer> block = new HashSet<>();for (String s : deadends) {block.add(Integer.parseInt(s));}Set<Integer> seen = new HashSet<>();Stack<Integer> stack = new Stack<>();stack.push(0);int step = 0;while (!stack.isEmpty()) {Stack<Integer> nextStack = new Stack<>();while (!stack.isEmpty()) {int cur = stack.pop();if (cur == t) return step;if (block.contains(cur) || seen.contains(cur)) continue;seen.add(cur);nextStack.add(move(cur, 0, true));nextStack.add(move(cur, 0, false));nextStack.add(move(cur, 1, true));nextStack.add(move(cur, 1, false));nextStack.add(move(cur, 2, true));nextStack.add(move(cur, 2, false));nextStack.add(move(cur, 3, true));nextStack.add(move(cur, 3, false));}step++;stack = nextStack;}return -1;}public int move(int cur, int index, boolean front) {int[] arr = new int[4];int i = 3;while (cur != 0) {arr[i] = cur % 10;cur /= 10;i--;}arr[index] = front ? ((arr[index] + 1) + 10) % 10 : ((arr[index] - 1) + 10) % 10;int result = 0;for (int j = 0; j < 4; j++) {result *= 10;result += arr[j];}return result;}
}
leetcode 752. Open the Lock | 752. 打开转盘锁(BFS)相关推荐
- 打开转盘锁 ,易懂的BFS解法
打开转盘锁 LeetCode752 题目描述: 你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', ' ...
- LeetCode 752. 打开转盘锁(图的BFS最短路径)
1. 题目 你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' .每个拨轮可以自由旋转:例如把 ...
- leetcode —— 752. 打开转盘锁
你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' .每个拨轮可以自由旋转:例如把 '9' 变 ...
- LeetCode 752. 打开转盘锁 (C#实现)——队列,广度优先搜索
一.代码实现 思路:使用先进先出的队列,广度优先搜索,使用字典可大幅减少遍历时间 问题:https://leetcode-cn.com/problems/open-the-lock/submissio ...
- leetcode 752. 打开转盘锁 c代码
先看题目: 你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' . 每个拨轮可以自由旋转:例如 ...
- 血战力扣752.打开转盘锁
你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' .每个拨轮可以自由旋转:例如把 '9' 变 ...
- 【广度优先搜索】N叉树的层序遍历 | 腐烂的橘子 | 单词接龙 | 最小基因变化 | 打开转盘锁
- 在JavaScript中判断键盘的大写锁定键(Caps Lock)是否打开(附扫描枪相关规则)
1,在按钮中配置onkeypress <input name='test' onkeypress ="testCapsLock(event)" /> 2,在JavaSc ...
- MySQL 锁的相关知识 | lock与latch、锁的类型、简谈MVCC、锁算法、死锁、锁升级
文章目录 lock与latch 锁的类型 MVCC 一致性非锁定读(快照读) 一致性锁定读(当前读) 锁算法 死锁 锁升级 lock与latch 在了解数据库锁之前,首先就要区分开 lock 和 la ...
最新文章
- SQL用于更新ID为顺序ID(用于删除了几条数据导致id不连续)
- 为什么到处都在推python_Python为什么能取得越来越超然的地位
- java将mysql数据写入到txt_java 追加写入数据到txt
- 理解lambda在linq中的应用
- python对seo有什么用_现在做seo会运用到python吗
- 豆瓣评分 9.7,等了好久的《操作系统导论》Operating Systems 终于来了
- java 数组协变_java 数组协变
- 利用 Finder 清理Mac旧档案,释放空间
- DB2 9 根本(730 检修)认证指南,第 6 局部: 数据并发性(2)
- HDU 1230解题报告
- php soapenv:server.userexception,SoapFault - faultcode: 'soap:Server' faultstring
- 相机标定中的四个坐标系
- Windows下CURL编译 支持HTTPS
- SEC再收中国互金企业招股书 融360成立简普科技拟融资2亿美元
- Git GitHub Gitee使用方法
- 数字IC设计随笔之二(VCS、DVE|Verdi单步调试)
- 纸壳CMS主题增强,支持主题中加入模板
- Arduino - 摇杆模块
- 第 304 场力扣周赛
- 移动端H5如何调用相册和相机上传图片、音频、视频
热门文章
- 2020CCPC(威海) - Clock Master(数论+分组背包)
- 牛客多校10 - Tournament(找规律)
- 牛客多校8 - All-Star Game(线段树分治+并查集按秩合并的撤销操作)
- 洛谷 - P1361 小M的作物(最大流最小割)
- HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)
- PAT (Advanced Level) 1016 Phone Bills(恶心模拟)
- html css 画五角星,纯 CSS3 绘制图形(心形、五角星、六边形等)
- Linux系统CUDA10.2+CUDNN安装教程
- 梅州有学java的地方吗,梅州java工资水平,梅州java工资很高吗,梅州java工资底薪能到多少...
- 0x5f3759df的数学原理