LeetCode 752. Open the Lock
原题链接在这里:https://leetcode.com/problems/open-the-lock/
题目:
You have a lock in front of you with 4 circular wheels. Each wheel has 10 slots: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'. The wheels can rotate freely and wrap around: for example we can turn '9' to be '0', or '0' to be '9'. Each move consists of turning one wheel one slot.
The lock initially starts at '0000', a string representing the state of the 4 wheels.
You are given a list of deadends dead ends, meaning if the lock displays any of these codes, the wheels of the lock will stop turning and you will be unable to open it.
Given a target representing the value of the wheels that will unlock the lock, return the minimum total number of turns required to open the lock, or -1 if it is impossible.
Example 1:
Input: deadends = ["0201","0101","0102","1212","2002"], target = "0202"
Output: 6
Explanation:
A sequence of valid moves would be "0000" -> "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202".
Note that a sequence like "0000" -> "0001" -> "0002" -> "0102" -> "0202" would be invalid,
because the wheels of the lock become stuck after the display becomes the dead end "0102".
Example 2:
Input: deadends = ["8888"], target = "0009"
Output: 1
Explanation:
We can turn the last wheel in reverse to move from "0000" -> "0009".
Example 3:
Input: deadends = ["8887","8889","8878","8898","8788","8988","7888","9888"], target = "8888"
Output: -1
Explanation:
We can't reach the target without getting stuck.
Example 4:
Input: deadends = ["0000"], target = "8888"
Output: -1
Note:
- The length of
deadendswill be in the range[1, 500]. targetwill not be in the listdeadends.- Every string in
deadendsand the stringtargetwill be a string of 4 digits from the 10,000 possibilities'0000'to'9999'.
题解:
If the deadends include begin or target string, then it could never reach target, return -1.
Otherwise, use BFS to iterate from "0000".
Every time, we poll and get the current. For each char in current, plus or minus 1, have the new candidate, if the caidiate is not visited or not in the deadend, add it to the queue.
Time Complexity: O(V+E). V is node count. E is edge count.
Space: O(V).
AC Java:
class Solution {
public int openLock(String[] deadends, String target) {
HashSet<String> hs = new HashSet<>(Arrays.asList(deadends));
if(hs.contains("0000") || hs.contains(target)){
return -1;
}
LinkedList<Node> que = new LinkedList<>();
HashSet<String> visited = new HashSet<>();
visited.add("0000");
que.add(new Node("0000", 0));
while(!que.isEmpty()){
Node cur = que.poll();
if(cur.s.equals(target)){
return cur.num;
}
String s = cur.s;
for(int i = 0; i<s.length(); i++){
char c = s.charAt(i);
String can1 = s.substring(0, i) + (c-'0'+1)%10 + s.substring(i+1);
if(!hs.contains(can1) && !visited.contains(can1)){
visited.add(can1);
que.add(new Node(can1, cur.num+1));
}
String can2 = s.substring(0, i) + (c-'0'+10-1)%10 + s.substring(i+1);
if(!hs.contains(can2) && !visited.contains(can2)){
visited.add(can2);
que.add(new Node(can2, cur.num+1));
}
}
}
return -1;
}
}
class Node{
String s;
int num;
public Node(String s, int num){
this.s = s;
this.num = num;
}
}
Could use bidirectional BFS.
Time Complexity: O(V+E).
Space: O(V).
AC Java:
class Solution {
public int openLock(String[] deadends, String target) {
HashSet<String> deadSet = new HashSet<>(Arrays.asList(deadends));
if(deadSet.contains("0000") || deadSet.contains(target)){
return -1;
}
int level = 0;
HashSet<String> beginSet = new HashSet<>();
HashSet<String> endSet = new HashSet<>();
beginSet.add("0000");
endSet.add(target);
while(!beginSet.isEmpty() && !endSet.isEmpty()){
if(beginSet.size() > endSet.size()){
HashSet<String> temp = beginSet;
beginSet = endSet;
endSet = temp;
}
HashSet<String> nextSet = new HashSet<>();
for(String s : beginSet){
if(endSet.contains(s)){
return level;
}
for(int i = 0; i<s.length(); i++){
char c = s.charAt(i);
String can1 = s.substring(0, i) + (c-'0'+1)%10 + s.substring(i+1);
String can2 = s.substring(0, i) + (c-'0'+10-1)%10 + s.substring(i+1);
if(!deadSet.contains(can1)){
nextSet.add(can1);
}
if(!deadSet.contains(can2)){
nextSet.add(can2);
}
}
}
level++;
beginSet = nextSet;
}
return -1;
}
}
LeetCode 752. Open the Lock的更多相关文章
- [LeetCode] 752. Open the Lock 开锁
You have a lock in front of you with 4 circular wheels. Each wheel has 10 slots: '0', '1', '2', '3', ...
- 【LeetCode】752. Open the Lock 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- LeetCode 752:打开转盘锁 Open the Lock
题目: 你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' .每个拨轮可以自由旋转:例如把 ' ...
- [LeetCode] 0752. Open the Lock 打开转盘锁
题目 You have a lock in front of you with 4 circular wheels. Each wheel has 10 slots: '0', '1', '2', ' ...
- LC 752 Open the Lock
由于这个问题,涉及了很多知识,例如数据结构里面的哈希表,c++中的迭代器,因此,需要对于每一个疑惑逐一击破. 问题描述 You have a lock in front of you with 4 c ...
- Java实现 LeetCode 752 打开转盘锁(暴力)
752. 打开转盘锁 你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' .每个拨轮可以自由旋 ...
- Leetcode: Find Permutation(Unsolve lock problem)
By now, you are given a secret signature consisting of character 'D' and 'I'. 'D' represents a decre ...
- leetcode 752. 打开转盘锁
地址 https://leetcode-cn.com/problems/open-the-lock/ 你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', ...
- LeetCode All in One题解汇总(持续更新中...)
突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...
随机推荐
- Django 模板语言 变量名称
Django 模板语言 变量名称 模板语言中已变量形式显示 # view 文件内 def func(request): return render(request,"index.html&q ...
- Java学习:异常的概念
异常 异常概念 异常:指的是程序在执行过程中,出现的非正常的情况,最终导致JVM的非正常停止. 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出一个异常对象.Java ...
- thymeleaf是用于编写html模版的编程语言(工具语言)
一.编程语言 用于编写html模版的编程语言. thymeleaf一种命令式和声名式混合的寄生语言. html与thymeleaf的结合是dsl与命令式语言的结合. html与thymeleaf的结合 ...
- TCP/UDP的网络底层实现
1.1Socket的使用背景 当我们在使用微信.玩游戏.收发邮件,以及用web浏览器上网时,底层的实现是TCP/UDP的协议,封装socket实现网络通信功能. 了解了网络通信的底层实现原理,在出现s ...
- C# 多维数组 交错数组的区别,即 [ , ] 与 [ ][ ]的区别 (转载)
多维数组的声明 在声明时,必须指定数组的长度,格式为 type [lenght ,lenght ,lengh, ... ] , ]; 或声明时即赋值,由系统推断长度 int [,] test1 = { ...
- C# 进程 与 线程
C#多线程和线程池1.0.线程的和进程的关系以及优缺点windows系统是一个多线程的操作系统.一个程序至少有一个进程,一个进程至少有一个线程.进程是线程的容器,一个C#客户端程序开始于一个单独的线程 ...
- Options of the DB storage of prometheus
参考: // Options of the DB storage. type Options struct { // The timestamp range of head blocks after ...
- logback配置和使用
简介 logback是由log4j创始人设计的又一个开源日志组件.当前分成三个模块: logback-core是其它两个模块的基础模块. logback-classic是log4j的一个 改良版本.此 ...
- 18、git提交代码并将develop分支合并到master分支上
提交合并代码流程: git add .git commit -m ''git pushgit checkout mastergit merge develop //将develop 分支与master ...
- pandas 之 字符串处理
import numpy as np import pandas as pd Python has long been a popular raw data manipulation language ...