752. Open the Lock

文章目录

  • 1 题目理解
  • 2 BFS
  • 3 用int构建状态

1 题目理解

一个钟表有4个槽,每个槽可以停在0-9,10个状态。钟表每个槽的轮子可以转,例如可以从0转到9,也可以从0转到1。
钟表的起始状态是"0000"。每个数字代表一个槽的状态。
输入:字符串数组deadends,表示不能死亡状态,进入这个状态钟表就被锁住了,不能动了。输入字符串target表示想要达到的状态。
输出:到达最终状态的最少需要多少步。如果不能达到则为-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”.

2 BFS

要求最短路径长度,所以使用BFS。
在某一种状态下,要先判断这个状态能不能动。如果deadends包含target,则不能达到。

在正常状态下,某一状态的变化,可以变化其中一个槽,变化的动作可以是加1,也可以是减1。变化之后进入新的状态。

    class Solution {public int openLock(String[] deadends, String target) {Set<String> set = new HashSet<String>();for(String str : deadends){set.add(str);}String start = "0000";if(set.contains(target) || set.contains(start)) return -1;Queue<String> queue = new LinkedList<String>();queue.offer(start);set.add(start);int step = 0;while(!queue.isEmpty()){int size = queue.size();//System.out.println(queue);for(int r=0;r<size;r++){if(target.equals(queue.peek())){return step;}char[] current = queue.poll().toCharArray();for(int i=0;i<4;i++){char ch = current[i];int v = current[i]-48;current[i] = (char)(((v+1+10)%10)+48);String newState = new String(current);if(!set.contains(newState)){queue.offer(newState);set.add(newState);}current[i] = (char)(((v-1+10)%10)+48);String newState2 = new String(current);if(!set.contains(newState2)){queue.offer(newState2);set.add(newState2);}current[i] = ch;}}step++;}return -1;}}

时间复杂度:可以选择的数据范围n=10,状态位数x=4,O(104∗4∗4)O(10^4*4*4)O(10444)。最坏情况下有10410^4104种状态。每个状态可以有4*2=8种变化,所以是O(x)。枚举后得到新的状态,构建字符串,需要O(x)时间。所以最终结果是:O(nx∗x∗x)O(n^x*x*x)O(nxxx)

3 用int构建状态

因为每个位置的值在0-9之间,可以用4位二进制表示,我们可以用int表示状态,这样速度方面会更快。

class Solution {private final static int[] increments = new int[]{ 1, -1 };public int openLock(String[] deadends, String target) {int step = 0;Set<Integer> used = new HashSet<Integer>();String start = "0000";int startInt = 0;int targetInt = buildState(target);for(String deadend : deadends){used.add(buildState(deadend));}if(used.contains(startInt) || used.contains(targetInt)) return -1;used.add(startInt);Queue<Integer> queue = new LinkedList<Integer>();queue.offer(startInt);while(!queue.isEmpty()){int size =queue.size();for(int i=0;i<size;i++){int nodeInt = queue.poll();if(nodeInt==targetInt) return step;for(int increment : increments){for(int j =0;j<4;j++){int newNode = updateState(nodeInt,j,increment);if(!used.contains(newNode)){used.add(newNode);queue.offer(newNode);}}}}step++;}return -1;}private int updateState(int state, int d, int inc) {int mask = (1 << 4) - 1;int[] num = new int[]{state & mask,(state >> 4) & mask,(state >> 8) & mask,(state >> 12) & mask};int n = num[d];if (n == 0 && inc == -1) {num[d] = 9;} else if (n == 9 && inc == 1) {num[d] = 0;} else {num[d] += inc;}int res = 0;for (int i = 3; i >= 0; i--) {res <<= 4;res |= num[i];}return res;}private int buildState(String state) {char[] c = state.toCharArray();int res = 0;for (int i = 0; i < c.length; i++) {int d = c[i] - '0';res <<= 4;res |= d;}return res;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动开发 视频收集

构建基于SQL CE的移动方案http://download.chinaitlab.com/video/files/8282.html转载于:https://www.cnblogs.com/Regal/archive/2006/03/23/356800.html

移动混合开发之android文件管理新建文件和删除文件

今天经过一天超过8小时的实践&#xff0c;有很多CSS上的细节需要注意&#xff1a; 1&#xff0c; /*注意是对before的操作*/ .content ul li .icon-check-empty:before{display: block;/*webFont设置其width和height时无效,只有设置font-size*//*width: 3rem;*//*height: 3rem;…

spring mvc学习(19):cookievalue注解(显示cookie的值,默认必须有值)

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

续:C#串口操作

今天继续写C#的工业扫描串口。突然遇到一个很奇怪的问题&#xff1a;那就是我要求把某些码得到之后进行业务处理&#xff0c;但是就是这个时候突然发现扫描出来的 码位数不正确了&#xff01;我就很怀疑自己的代码逻辑了。于是&#xff0c;我就逐行进行调试&#xff0c;而接受口…

spring mvc学习(20):RequestHeader(获取请求头中某一部分值)

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

698. Partition to K Equal Sum Subsets

文章目录1 理解题目2 分析2.1进一步优化2.2 根据花花酱解答1 理解题目 Given an array of integers nums and a positive integer k, find whether it’s possible to divide this array into k non-empty subsets whose sums are all equal. 输入&#xff1a;一个int数组nums…

spring mvc学习(21):testparam请求参数和请求头表达式

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

OpenGL ES GLKit初探

#GLKit框架 GLKit框架的设计目的是为了简化OpenGL/OpenGL ES的应用开发。它的出现加快了OpenGL或OpenGL ES应用程序的开发。使用数学库、背景纹理加载&#xff0c;预先创建着色器效果&#xff0c;以及标准视图和视图控制器来实现渲染循环。 GLKit框架提供了功能和类&#xff0c…

一个封装了的ADO类,功能非常强大,并做了一个DEMO演示如何操作ACCESS数据库

呵呵&#xff0c;说实在的&#xff0c;这个类俺是从外国论坛上下载的&#xff0c;自己研究了下如何使用并做了一个DEMO&#xff0c;演示如何操作ACCESS数据库。希望给那些没有接触数据库编程的初学者一点启发吧。有任何问题请及时与我联系^_^。程序下载地址&#xff1a;/Files/…

93. Restore IP Addresses

文章目录1 题目理解2 回溯1 题目理解 输入&#xff1a;字符串s 输出&#xff1a;可能的ip地址 规则&#xff1a;一个有效的ip地市是一连串数字&#xff0c;数字范围在0到255&#xff0c;每个数字不能有前导0。例如"0.1.2.201" and "192.168.1.1"是有效ip地…

spring mvc学习(22):/textpath/*/helen

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

131. Palindrome Partitioning

文章目录1 题目理解2 回溯3 动态规划1 题目理解 输入&#xff1a;字符串s 规则&#xff1a;将字符串s分割&#xff0c;分割后每一个部分都是一个回文串。 输出&#xff1a;所有的分割方式 Example 1: Input: s “aab” Output: [[“a”,“a”,“b”],[“aa”,“b”]] Examp…

4 文件操作 支持图片 视频 mp3 文本等

#文件操作:send_file,支持图片 视频 mp3 文本等app.route("/img")def img(): return send_file("1.jpg")转载于:https://www.cnblogs.com/ajaxa/p/11156483.html

我的博客开张了!!!

留个脚印,嘻嘻! 转载于:https://www.cnblogs.com/stu-acer/archive/2006/04/26/385453.html

第一百零五期:5年前,跳槽涨薪,你笑了,5年后,跳槽降薪,你慌了!

去年&#xff0c;我在年度绩效面谈中与某中年技术男就 “从测试转向产品经理” 的这个话题上进行了一些探讨与分析。 作者&#xff1a;王晔倞 图片来自 Pexels 或许是因为分析的角度比较客观、真实&#xff0c;再加上俩人都比较会演戏&#xff0c;我激情&#xff0c;他投入&a…

241. Different Ways to Add Parentheses

文章目录1 题目理解2 分治法1 题目理解 输入&#xff1a;字符串input&#xff0c;包含数字和操作符 规则&#xff1a;给input的不同位置加括号&#xff0c;使得input可以得到不同的计算结果。 输出&#xff1a;返回可能的计算结果 Example 1: Input: “2-1-1” Output: [0, 2…

第一百零六期:长相不讨AI喜欢面试就会挂?全球百万求职者经历AI“看脸”面试

AI不仅会筛选你的简历&#xff0c;还会通过看脸决定你能否通过面试。这不是将来时。全球已有超过一百万求职者&#xff0c;经历过AI面试官的冷酷“凝视”。 作者&#xff1a;鱼羊 本文经AI新媒体量子位&#xff08;公众号ID:QbitAI&#xff09;授权转载&#xff0c;转载请联系…

最近比较忙

最近项目真是忙的可以不过还好前几天没事搞了个电影小偷,闲下来看看电影真是不错站在这里要的回下就可以了http://www.ve99.com 转载于:https://www.cnblogs.com/flashicp/archive/2006/04/29/388972.html

服务器控件HtmlTable下控件赋值问题

在程序开发过程中&#xff0c;碰到这样的问题&#xff1a; 1<table>2<tr>3<td><asp:DropDownList iddropdownlist1 runatserver></td>4</tr>5</table>在基类页中有如下代码&#xff1a;1foreach(Control pagectl inPage.Controls[1]…

Foundry feats. MultiverseStudio

https://www.foundry.com/news-awards/foundry-jcube-announcement 经过这么多年的过程&#xff0c;本周本产品终于发布了PR&#xff0c;这次是由Foundry独家代理销售。 目前本产品已经在全球第一线的工作室的流程内使用&#xff0c;用来装配无法想象巨大的场景&#xff0c;如果…