Leetcode刷题笔记——数据结构(队列/栈)

本文介绍了一种使用广度优先搜索算法解决转盘锁问题的方法。通过构建队列和哈希集合,算法能有效避免重复状态,找到从初始状态到达目标状态的最短路径。代码实现中,利用了8种可能的状态转换,确保了搜索的全面性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.打开转盘锁

原题
在这里插入图片描述
思路: 状态位一共有4位,前后都可进一步,所以从一个状态到下一个状态有8种可能。在这个基础上,采用广度优先的思想来解题。需要的数据结构是队列,并且还需要一个哈希集合来判断状态是否已经尝试。并且用nll放入队列来隔开每一层的遍历。
所以:

  • 当取出队列中的第一个节点,先判断是否位null,如果是,则说明进入下一层,即步数加一,并且判断队列中第一个元素是否是null,如果不是的话,在队列末尾加null。
  • 再判断节点是否是目标节点
  • 最后判断是否是死亡节点,如果不是的话,对这个节点进行广度优先搜索。将它的八种状态都加入队列,在加之前,判断一下是否已经遍历过。

上代码:

class Solution {
    public int openLock(String[] deadends, String target) {
        Set<String> dead=new HashSet<>();
        Set<String> seen=new HashSet<>();
        for(String s:deadends)
            dead.add(s);
        Queue<String> list=new LinkedList<>();
        list.offer("0000");
        list.offer(null);
        //seen.add("0000");
        int depth=0;
        while(!list.isEmpty()){
            String node=list.poll();
            seen.add(node);
            if(node==null){
                depth++;
                if(list.peek()!=null){
                    list.offer(null);
                }
            }else if(node.equals(target)){
                return depth;
            }
            else if(!dead.contains(node)){
                
                for(int i=0;i<4;i++){
                    for(int j=-1;j<=1;j+=2){
                        int temp=(node.charAt(i)-'0'+j+10)%10;
                        String newnode=node.substring(0,i)+(""+temp)+node.substring(i+1);
                        if(!seen.contains(newnode)){
                            seen.add(newnode);
                            list.offer(newnode);
                        }
                    }
                }
            }
          
        }
        return -1;
        
            

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值