力扣752. 打开转盘锁

news2024/11/26 10:01:17

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 skipped
        Set<String> deads = new HashSet<>();
        for (String s : deadends) {
            deads.add(s);
        }
        // Record passwords that have been exhausted to prevent backtracking
        Set<String> visited = new HashSet<>();
        Queue<String> q = new LinkedList<>();
        // Start breadth-first search from the starting point
        int step = 0;
        q.offer("0000");
        visited.add("0000");

        while (!q.isEmpty()) {
            int sz = q.size();
            // Spreads all nodes in the current queue around
            for (int i = 0; i < sz; ++i) {
                String cur = q.poll();
                // Determine whether the destination is reached
                if (deads.contains(cur)) {
                    continue;
                }
                if (cur.equals(target)) {
                    return step;
                }

                // Adds the untraversed adjacents of a node to the queue
                for (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.coloradmin.cn/o/1816787.html

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

相关文章

操作系统入门系列-MIT6.828(操作系统工程)学习笔记(七)---- 系统调用函数与GDB(Lab: system calls)

系列文章目录 操作系统入门系列-MIT6.828&#xff08;操作系统工程&#xff09;学习笔记&#xff08;一&#xff09;---- 操作系统介绍与接口示例 操作系统入门系列-MIT6.828&#xff08;操作系统工程&#xff09;学习笔记&#xff08;二&#xff09;---- 课程实验环境搭建&am…

组织创新|AI赋能敏捷实践,助力企业敏捷转型

在工业5.0时代&#xff0c;随着项目变得越来越复杂&#xff0c;对效率的需求也在增长&#xff0c;致力于敏捷转型的组织正在寻求创新的解决方案来应对常见的挑战&#xff1a;工作量不平衡、低效的任务分配和知识孤岛等等。对此&#xff0c;AI等尖端技术的潜力可以帮助实现更高效…

mask2former利用不确定性采样点选择提高模型性能

在机器学习和深度学习的训练过程中&#xff0c;不确定性高的点通常代表模型在这些点上的预测不够可靠或有较高的误差。因此&#xff0c;关注这些不确定性高的点&#xff0c;通过计算这些点的损失并进行梯度更新&#xff0c;可以有效地提高模型的整体性能。确定性高的点预测结果…

互联网全栈开发:产品经理、后端开发、前端开发、运维、测试等

我们都知道互联网公司&#xff0c;有几个较为重要的职业&#xff1a; 产品经理 后端开发 前端开发 运维 测试 这些技术往往相互隔阂&#xff0c;存在技术壁垒&#xff0c;而我开通了抖音号&#xff0c;常在抖音中发送这些视频&#xff0c;我的抖音号:1056668488。请大家麻…

EVA-CLIP实战

摘要 EVA-CLIP,这是一种基于对比语言图像预训练(CLIP)技术改进的模型,通过引入新的表示学习、优化和增强技术,显著提高了CLIP的训练效率和效果。EVA-CLIP系列模型在保持较低训练成本的同时,实现了与先前具有相似参数数量的CLIP模型相比更高的性能。特别地,文中提到的EV…

10 款最佳免费 Google SEO 工具

谷歌提供了免费测试和报告的工具&#xff0c;以帮助网站所有者和 SEO 专业人员分析和提高其网站的搜索性能。这些是最好的免费谷歌搜索引擎优化工具&#xff0c;用于升级您的搜索引擎优化&#xff0c;以及帮助您发现新的关键字机会以及帮助您发现新的关键字机会的工具。 无论您…

Nature最新!浙大王浩华团队:一种创新方法使量子态传输的保真度大大提高

在量子计算的快速发展过程中&#xff0c;量子信息传输技术&#xff08;量子态传输&#xff09;的进步至关重要。 然而&#xff0c;当前固态量子系统在实现量子信息传输方面存在一些显著的挑战&#xff0c;例如量子混沌或者系统不完美&#xff0c;其传输的保真度和效率通常难以…

VMware Ubuntu虚拟机上设置SSH连接,win直接用ssh连接虚拟机

要在Ubuntu虚拟机上设置SSH连接&#xff0c;并进行一些特定配置&#xff0c;您可以按照以下步骤进行操作&#xff1a; 步骤 1&#xff1a;安装OpenSSH Server 打开终端。 更新包列表并安装OpenSSH Server&#xff1a; sudo apt update sudo apt install openssh-server安装完…

51单片机实验05 -点阵

目录 一&#xff0c;熟悉矩阵led小灯 1&#xff0c;点亮矩阵的一只led 2&#xff0c;点亮矩阵的一排led 3&#xff0c;点亮矩阵的全部led static 关键字 unsigned 关键字 4&#xff0c;点阵的静态显示 2&#xff09;心形矩阵显示代码 3&#xff09;效果 二&#xff0c;课…

跑起来字节跳动音频超分开源项目versatile_audio_super_resolution

已部署在AutoDL上https://www.codewithgpu.com/i/haoheliu/versatile_audio_super_resolution/versatile_audio_super_resolution ipynb: 音乐 By 邓文怡 一个深圳的小姑娘%cd /root/versatile_audio_super_resolution/运行目录# 读取一个mp3音频文件&#xff0c;然后将它转换…

数据安全交换系统 与网闸有什么区别?

数据安全交换系统是指用于安全地传输、共享和交换数据的一种系统。这样的系统通常包括一系列安全性和隐私保护功能&#xff0c;确保数据在传输和存储过程中不会被未经授权的用户访问、泄露或篡改。 数据安全交换系统和网闸在功能和定位上有一些区别&#xff1a; 功能&#xff…

PDU模块中浪涌保护模块与空开模块的应用

由于PDU具体应用的特殊性&#xff0c;其在规划设计时具有应用场景的针对性&#xff0c;同时PDU的高度定制化的特点&#xff0c;是其他电气联接与保护产品所不具备的。 PDU基础的输出输入功能外&#xff0c;其电路的控制与电压保护器同时也极为重要。空气开关和浪涌保护器相关功…

Java课程设计:基于Java+Swing+MySQL的图书管理系统(内附源码)

文章目录 一、项目介绍二、项目展示三、源码展示四、源码获取 一、项目介绍 图书管理系统是一个常见的软件项目,广泛应用于图书馆、学校、企业等需要管理图书资源的场景。该系统通常涵盖图书信息录入、查询、借阅、归还等核心功能,是实现图书资源高效管理的重要工具。 随着信…

coap:使用californium建立coap server和client的简单示例

【pom.xml】 <dependency><groupId>org.eclipse.californium</groupId><artifactId>californium-core</artifactId><version>2.0.0-M7</version> </dependency> <dependency><groupId>org.eclipse.californium&l…

元宇宙3D虚拟代言人凸显企业形象和品牌风格

在虚拟社交的新时代浪潮中&#xff0c;拥有一个个性鲜明的AI数字人形象&#xff0c;无疑能让你在虚拟的海洋中独领风骚。深圳华锐视点作为你的数字形象创造的合作伙伴&#xff0c;为你呈现了一个丰富多彩的素材库与高度灵活的编辑工具。在这里&#xff0c;你可以依据个人喜好和…

爆款AI工具大盘点:最强文本、视频、音乐生成AI,适用岗位全解析!

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

内存管理--3.用幻灯片讲解C++手动内存管理

用幻灯片讲解C手动内存管理 1.栈内存的基本元素 2.栈内存的聚合对象 3.手动分配内存和释放内存 注意&#xff1a;手动分配内存&#xff0c;指的是在堆内存中。 除非实现自己的数据结构&#xff0c;否则永远不要手动分配内存! 即使这样&#xff0c;您也应该通过std::allocator…

Redis 配置及操作整理

本篇文章介绍了Redis在window中如何安装和修改配置及Redis几种数据类型及操作命令。 目录 window环境安装 修改配置 设置密码 设置最大内存大小 其他参数介绍 启动服务 使用客户端 客户端连接 验证密码 Redis数据类型 String 设置 运算 其它 Hash 设置 获取 …

文件操作学不懂,小代老师带你深入理解文件操作(上卷)

文件操作学不懂&#xff0c;小代老师带你深入理解文件操作上卷 1. 为什么使用⽂件&#xff1f;2. 什么是⽂件&#xff1f;2.1 程序⽂件2.2 数据⽂件2.3 文件名 3. 二进制文件和文本文件&#xff1f; 1. 为什么使用⽂件&#xff1f; 如果没有⽂件&#xff0c;我们写的程序的数据…

旋转方块加载动画

效果图: 完整代码: <!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>旋转方块加载动画</title><style type="text/css">body {background: #ECF0F1;display: flex;justify-content: center;al…