753.破解保险箱

原题🔗:力扣

这道题的思路有两个主要要点。

第一个是构造一个节点数为k^(n-1)、出度和入度均为k的图。

第二个是从这张图中找到一个欧拉回路。

针对第一点:图的构造,按照题意,实际上👇的蓝色框(n位数)就是要cover所有可能的n位数密码组合,所以我们要从图中 获得k^n个可能的n位数,而此时已经存在k^(n-1)个节点,所以我们只需要将所有节点的k个(出)路径全部经过即可。

针对第二点,欧拉回路的算法👇

 为什么需要将从v开始的所有回路镶嵌到原来(以u为起点)的回路中?是为了保证生成的n位数是连贯的。(这里我也不确定,是猜想的)

class Solution {
    StringBuilder sb = new StringBuilder();
    int n, k, mod;
    Set<Integer> vis = new HashSet<>(); //判断每条边是否访问过
    public String crackSafe(int N, int K) {
        n = N; k = K; mod = (int)Math.pow(10, n - 1); 
        dfs(0); //从0点出发
        sb.append("0".repeat(n - 1));
        return sb.toString();
    }
    void dfs(int u) {
        for (int i = 0; i < k; i++) { //对于每个点循环k条边即可
            int v = u * 10 + i; //即边的编号
            if (vis.contains(v)) continue; 
            vis.add(v);    //标记该边已经访问 
            dfs(v % mod); //去掉第一位为结点编号 
            sb.append(i); //添加最后一个数字
        }
    }
}

作者:Tizzi
链接:https://leetcode.cn/problems/cracking-the-safe/solutions/2054157/javac-ou-la-hui-lu-by-tizzi-rzsy/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值