【Breadth-first Search 】752. Open the Lock
输入:deadends 是指针终止状态列表,target 是希望到达的指针状态,初始化指针状态是0000。
输出:如果指针能够到达target状态,则变化的最少步骤是多少。如果不能到达target状态,返回-1。
分析:指针的状态有0000,0001,… 9999 ,1万种状态。可以看做是1万个节点。
每个状态之间如果只有一个位置上的值有变化,则这两个状态之间有连线。例如节点0000,和1000,0100,0010,0001,9000,0900…等这些节点有联系。
每个节点上的每一个位置有三种操作:减1,不变,加1。
解决思路就是按照BFS的标准思路。先处理0000节点,接着处理与其相邻的节点,再依次扩散出去。
本题目很影响效率的地方是节点一个位置坐加1,建1的操作变化。
直接操作字符串,没有问题,只是会慢。
//变换for(int j=0;j<4;j++){int val = node.charAt(j)-48;int newVal = (val==9?0:val+1);int newVal1 = (val==0?9:val-1);String newNode = node.substring(0,j)+newVal+node.substring(j+1);if(!set.contains(newNode)){queue.offer(newNode);set.add(newNode);}String newNode1 = node.substring(0,j)+newVal1+node.substring(j+1);if(!set.contains(newNode1)){queue.offer(newNode1);set.add(newNode1);}}
还有一种思路是用二进制来做。链接。
对于节点node=“1234”,先转为int。这个int有效位数是16位。这个int是这样的:
0001 0010 0011 0100 ,依次表示1,2,3,4。
如果需要将2变为3,则可以进行如下操作:
int mask = (1 << 4) - 1;int[] num = new int[]{(nodeInt >> 12) & mask,(nodeInt >> 8) & mask,(nodeInt >> 4) & mask,nodeInt & mask};num[1] +=1;int res = 0;for (int i = 0; i <4 ; i++) {res <<= 4;res |= num[i];}
先使用掩码mask,把nodeInt的值分成4个值放到数组中。接着修改某一位置的值。最后再通过移位,做异或操作成为新的状态。这样速度就快很多。
代码
【Breadth-first Search 】752. Open the Lock相关推荐
- Taste/Thoth:Taste Architecture 概览【转Beyond Search】
Taste 有着非常清晰的程序架构.看图说话,下面就是一个 User-based Recommender 的例图,说明了各个组件之间的关系.而对于一个 Item-based Recommender,除 ...
- 【Full text search】检索条件具有完整的关键词布尔逻辑运算AND、OR、NOT能力
全文检索需求 1)系统提供模糊检索.分类搜索.高级复合搜索.全文检索.图片内容检索.跨库检索等多种检索途径: 2)支持字索引和词索引: 3)检索条件具有完整的关键词布尔逻辑运算AND.OR.NOT能力 ...
- 【Java并发编程】并发编程大合集
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容 ...
- 【Matlab答题卡识别】hough变换答题卡判定与成绩统计【含GUI源码 752期】
一.代码运行视频(哔哩哔哩) [Matlab答题卡识别]hough变换答题卡判定与成绩统计[含GUI源码 752期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [ ...
- 【全局路径规划】A*算法 A* Search Algorithm
A Formal Basis for the Heuristic Determination of Minimum Cost Paths PETER E.HART NILS J. NILSSON BE ...
- 【数据结构(C语言)】数据结构-图
图 文章目录 图 一.基本概念 1.图的定义 2.约定符号 3.分类 4.子图 5.路 6.其他术语 7.ADT 二.存储结构 1.邻接矩阵(数组) 2.邻接表 三.基本算法 1.遍历 2.求无向图的 ...
- 【每日一题】 959. 由斜杠划分区域
[每日一题] 959. 由斜杠划分区域 避免每日太过咸鱼,一天搞定一道LeetCode算法题 一.题目描述 在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /. ...
- 【数据结构与算法】第二篇:算法部分
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.程序的时间和空间复杂度分析 (1)理解算法时间复杂度的表示法 ( ...
- 【FE前端学习】第二阶段任务-基础
技能学习部分: 1.需要熟练掌握HTML标签以及CSS各个常用属性. 2.掌握CSS3 常用属性 3.掌握jquery的基本用法,对于JS基本逻辑语句需要熟练掌握 上文 [FE前端学习]第二阶段任务- ...
最新文章
- Python 二维数组
- 算法练习day19——190410(数组中重复的数字、替换空格、从尾到头打印链表)
- matlab函数表达式里分号_C语言表达式和语句
- .net:设计一个web应用
- Script:Generate A DDL Script For A Table
- (205)硬件实现多时钟设计
- 知名插画师描绘nova6“5G”潮乐园 十城nova6自拍互动装置即将引爆
- java第五章课后题_黑猴子的家:Java SE 练习题第五章
- java 设置sesion 生命周期
- Linux CAT与ECHO命令详解 <<EOF EOF
- C++类的静态成员函数
- php递归函数名字,php递归示例 php递归函数代码
- 微信聊天api接口调用代码
- 3dmax如何快速查找丢失贴图,并根据贴图快速找到对应物体
- 企业管理的六大关系和八大系统
- 幽默笑话大全 API 接口
- M1 mac外接显示器休眠后又失败
- mindspore| lenet模型 推理过程记录
- arm学习之基本汇编指令
- 使用铝、金、铜做电极的CCD摄像机