【双向BFS】LeetCode 752. 打开转盘锁
题目链接
思路
双向BFS,详见宫水三叶大佬题解。
与拓展题目的思路异曲同工。
代码
class Solution {
public int openLock(String[] deadends, String target) {
String beginNumber = "0000";
String endNumber = target;
Set<String> deadNumbers = new HashSet<>(Arrays.asList(deadends));
if(deadNumbers.contains(beginNumber)){
return -1;
}
if(beginNumber.equals(target)){
return 0;
}
return bfs(beginNumber, endNumber, deadNumbers);
}
int bfs(String beginNumber, String endNumber, Set<String> deadNumbers){
Queue<String> queueBegin = new LinkedList<>();
Queue<String> queueEnd = new LinkedList<>();
HashMap<String, Integer> mapBegin = new HashMap<>();
HashMap<String, Integer> mapEnd = new HashMap<>();
queueBegin.offer(beginNumber);
queueEnd.offer(endNumber);
mapBegin.put(beginNumber, 0);
mapEnd.put(endNumber, 0);
int result = -1;
while(!queueBegin.isEmpty() && !queueEnd.isEmpty()){
if(queueBegin.size() < queueEnd.size()){
result = update(queueBegin, mapBegin, mapEnd, deadNumbers);
}else{
result = update(queueEnd, mapEnd, mapBegin, deadNumbers);
}
if(result != -1){
break;
}
}
return result;
}
int update(Queue<String> queue, HashMap<String, Integer> current,
HashMap<String, Integer> other, Set<String> deadNumbers){
int size = queue.size();
while(size > 0){
size--;
String currentNumber = queue.remove();
for(int i = 0; i < currentNumber.length(); i++){
for(int j = -1; j <= 1; j++){
if(j == 0){
continue;
}
int nextInt = (currentNumber.charAt(i) - '0' + j) % 10;
if(nextInt == -1){
nextInt = 9;
}
String nextNumber = currentNumber.substring(0, i) + nextInt + currentNumber.substring(i + 1);
if(!deadNumbers.contains(nextNumber)){
if(current.containsKey(nextNumber) &&
current.get(nextNumber) <= current.get(currentNumber) + 1){
continue;
}
if(other.containsKey(nextNumber)){
return current.get(currentNumber) + 1 + other.get(nextNumber);
}else{
current.put(nextNumber, current.get(currentNumber) + 1);
queue.offer(nextNumber);
}
}
}
}
}
return -1;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」