当前位置: 首页 > news >正文

力扣752. 打开转盘锁

Problem: 752. 打开转盘锁

文章目录

  • 题目描述
  • 思路及解法
  • 复杂度
  • Code

题目描述

在这里插入图片描述在这里插入图片描述

思路及解法

1.用一个集合 deads 存储所有的“死锁”状态,一个集合 visited 存储所有已经访问过的状态,以避免重复访问,一个队列 q 进行广度优先搜索(BFS);并将 deadends 数组中的每个元素加入 deads 集合。
2.将初始状态 “0000” 加入队列 q 并标记为已访问。

3.进行广度优先搜索(BFS):

3.1.获取当前队列的大小 sz,表示当前层级中的节点数。
3.2.遍历当前层级中的每个节点:

3.2.1.从队列中取出一个节点 cur。如果 cur 在 deads 中,则跳过该节点。如果 cur 等于目标状态 target,则返回当前步数 step。
3.2.2.生成当前状态 cur 的所有相邻状态(每一位向上拨或向下拨):对于每个相邻状态 up 和 down,如果尚未访问过,则加入队列并标记为已访问,最后使得步数step++

复杂度

时间复杂度:

O ( N × M ) O(N \times M) O(N×M);其中 N N N为状态空间0000 - 9999, M M M为每个状态的子节点树(即为8.具体到本题中可以认为时间复杂度为常量级别,同理空间复杂度也为常量级别)

空间复杂度:

O ( N ) O(N) O(N)

Code

class Solution {/*** Open the Lock** @param deadends Given string* @param target   Given string* @return int*/public int openLock(String[] deadends, String target) {// Record the death password to be skippedSet<String> deads = new HashSet<>();for (String s : deadends) {deads.add(s);}// Record passwords that have been exhausted to prevent backtrackingSet<String> visited = new HashSet<>();Queue<String> q = new LinkedList<>();// Start breadth-first search from the starting pointint step = 0;q.offer("0000");visited.add("0000");while (!q.isEmpty()) {int sz = q.size();// Spreads all nodes in the current queue aroundfor (int i = 0; i < sz; ++i) {String cur = q.poll();// Determine whether the destination is reachedif (deads.contains(cur)) {continue;}if (cur.equals(target)) {return step;}// Adds the untraversed adjacents of a node to the queuefor (int j = 0; j < 4; ++j) {String up = plusOne(cur, j);if (!visited.contains(up)) {q.offer(up);visited.add(up);}String down = minusOne(cur, j);if (!visited.contains(down)) {q.offer(down);visited.add(down);}}}step++;}return -1;}/*** Flip s[j] up once** @param s Given string* @param j Current number value* @return String*/private String plusOne(String s, int j) {char[] ch = s.toCharArray();if (ch[j] == '9') {ch[j] = '0';} else {ch[j] += 1;}return new String(ch);}/*** Move s[i] down once** @param s Given string* @param j Current number value* @return String*/private String minusOne(String s, int j) {char[] ch = s.toCharArray();if (ch[j] == '0') {ch[j] = '9';} else {ch[j] -= 1;}return new String(ch);}
}
http://www.lryc.cn/news/370772.html

相关文章:

  • 揭秘:义乌理阳的跨境选品师项目
  • 电视剧推荐
  • ISO 19115-3:2023 关于元数据最小实例的允许命名空间的详细说明
  • 最新下载:CorelDraw 2023【软件附加安装教程】
  • QT系列教程(8) QT 布局学习
  • SpringCloud Gateway中Route Predicate Factories详细说明
  • 计算机视觉全系列实战教程:(八)图像变换-点运算、灰度变换、直方图变换
  • 4.MongoDB sharding Cluster 分片集群
  • PDF转图片工具
  • Day 19:419. 甲板上的战舰
  • Web前端专科实习:技能提升、实践挑战与职业展望
  • 简单脉冲动画效果实现
  • apache poi 插入“下一页分节符”并设置下一节纸张横向的一种方法
  • 【React】useCallback和useMemo使用指南
  • XMind软件下载-详细安装教程视频
  • 一个小的画布Canvas页面,记录点的轨迹
  • docker-compose教程
  • 结果出乎意料!MySQL和MariaDB谁快?MySQL 8.0比MySQL 5.6快吗?
  • Alienware外星人X17R2 原装Win11系统镜像下载 带SupportAssist OS Recovery一键恢复
  • 【NI国产替代】高速数据采集模块,最大采样率为 125 Msps,支持 FPGA 定制化
  • 【网络安全的神秘世界】2024.6.6 Docker镜像停服?解决最近Docker镜像无法拉取问题
  • 【Python入门与进阶】1基本输入和输出
  • CTF Show MISC做题笔记
  • 【QT5】<总览二> QT信号槽、对象树及常用函数
  • Button按钮类
  • 代码随想录-二叉树 | 111 二叉树的最小深度
  • PCA降维算法
  • Fast R-CNN 与 R-CNN的不同之处
  • 前端开发环境:Vue、Element Plus、Axios
  • 我的创作纪念日-在SCDN的5年