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

个人练习-Leetcode-剑指 Offer II 109. 开密码锁

题目链接:https://leetcode.cn/problems/zlDJc7/

题目大意:给出一个四位数字的密码锁,初始状态是0000,目标是targer。每一次转动只能让一个位的轮盘转动一下(0往后转是9)。有一个vector<string> deadends,里面有很多四位的数字,如果转到其中的数字,就会死锁。我们在达到目标的过程中不能死锁。返回到达目标的最小步数,如果无法达到目标,返回-1

思路:BFS,每一步,每个数字有8个可能的变化。如果未访问且不属于死锁就加入队列。但这题还有挺多小细节的,做的时候debug了挺久…

首先,因为要得到步数,因此需要记录BFS的层数。所以BFS的while循环内还得加一层,qs记录当前队列长度,然后遍历完前qs个元素才给步数+1。

其次,【是否访问过某个数字】,实际上在其未加入队列,而在其作为邻居被访问时就可以标记了。在代码中表现为accdec就可以加入known中。当其作为q.front()再标记时,实际上可能是第二次或更多次的访问了,此时可能出现【同一数字被塞入队列多次】的情况。

比如q[1]的邻居是1234,未访问且不死锁,加入队列。而q[2]的邻居也是1234,未访问且不死锁,又加入队列。这样就塞了多次。因此,一个数字作为邻居被访问到时,就将其标记为访问过。

还有两个edge cases。

  • 如果0000属于死锁,那么直接返回-1
  • 如果target就是0000,就直接返回0

第二处是因为我们对一个数字的操作都在其【作为邻居被访问时】进行,而在队列中作为队首访问时,不再判断是否与target相等了。

                    string acc = getAcc(q.front(), idx);if (!known.count(acc) && !de.count(acc)) {known.insert(acc);if (acc == target)return step+1;elseq.push(acc);}

完整代码

class Solution {
public:string getAcc(string str, int idx) {string ret = str;if (ret[idx] == '9')ret[idx] = '0';elseret[idx]++;return ret;}string getDec(string str, int idx) {string ret = str;if (ret[idx] == '0')ret[idx] = '9';elseret[idx]--;return ret;}int openLock(vector<string>& deadends, string target) {set<string> de;set<string> known;string init("0000");for (int i = 0; i < deadends.size(); i++)de.insert(deadends[i]);queue<string> q;q.push(init);known.insert(init);if (de.count(init))return -1;if (target == init)return 0;int step = 0;while (!q.empty()) {int qs = q.size();for (int j = 0; j < qs; j++) {for (int idx = 0; idx < 4; idx++) {string acc = getAcc(q.front(), idx);if (!known.count(acc) && !de.count(acc)) {known.insert(acc);if (acc == target)return step+1;elseq.push(acc);}string dec = getDec(q.front(), idx);if (!known.count(dec) && !de.count(dec)) {known.insert(dec);if (dec == target)return step+1;elseq.push(dec);}}q.pop();}step++;}return -1;}
};
http://www.lryc.cn/news/44206.html

相关文章:

  • 四个常见的Linux面试问题
  • 15、接口(C#)
  • C++中常见的容器类使用方法举例(vector、deque、map、set)
  • 什么是强缓存和协商缓存
  • 算法刷题之堆
  • javaweb导师选择系统
  • LeetCode150 逆波兰表达式求值
  • 【Node.js】项目开发实战(中)
  • 记录一次 New Bing 英语陪练
  • 【Python】照片居然能变素描?不会画画但是咱会代码
  • 已解决正确配置git环境变量
  • 【逐步剖C】-第十章-自定义类型之结构体、枚举、联合
  • Windows Server 2016 中文版、英文版下载 (updated Mar 2023)
  • Linux 4G 通信实验
  • 华为OSPF技术详细介绍,保姆级,谁都能看懂(一)
  • 行人车辆检测与计数系统(Python+YOLOv5深度学习模型+清新界面)
  • SM3哈希算法的FPGA实现 I
  • 【数据结构与算法】线性表--数组
  • 剑指offer排序专题
  • 已解决Cannot open D:\Soft\Python36\Scripts\pip3-script.py
  • 3 步走,快速上手 API 接口测试
  • 爬虫-day1-正则表达式作业
  • 【半监督医学图像分割 2023 CVPR】RCPS
  • 【UVM实战练习项目】2、UVM验证环境基本框架搭建(实例一)(纯软件环境,方便日后测试使用)
  • 【web前端初级课程】第四章 什么是JavaScript
  • 数字中国建设进行时:吉林大学党委常务副书记冯正玉一行调研实在智能
  • 面试官灵魂拷问[二]:SQL 语句中 where 条件后写上 1=1 是什么意思?
  • 进程与线程的关系
  • 自定义异常
  • 基于springboot物资管理系统(程序+数据库)