重新排序得到 2 的幂

该博客介绍了一个算法问题,即判断给定的正整数通过任意重排其数字后是否能变成2的幂。解决方案是通过预先计算2的幂并存储在一个集合中,然后使用深度优先搜索(DFS)对数字进行重排,并在搜索过程中检查结果是否存在于预处理的集合中。博客内容涵盖了动态规划、DFS和数字操作等概念。
摘要由CSDN通过智能技术生成

题目描述:

        给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。

示例 1:

输入:1
输出:true

思路:

打表 + DFS
一个朴素的做法是对 nn 进行重排,然后检查重排后的数值是否属于 22 的幂。

由于 22 的幂数固定,我们可以先通过「打表」将范围落在 [1, 1e9][1,1e9] 以内的 22 的幂预处理出来,这样我们可以在 O(1)O(1) 的复杂度内判断某个数是否为 22 的幂。

重排的过程则是 DFS 实现。

代码:

class Solution {

    static Set<Integer> set = new HashSet<>();

    static {

        for (int i = 1; i < (int)1e9+10; i *= 2) set.add(i);

    }

    int m;

    int[] cnts = new int[10];

    public boolean reorderedPowerOf2(int n) {

        while (n != 0) {

            cnts[n % 10]++;

            n /= 10;

            m++;

        }

        return dfs(0, 0);

    }

    boolean dfs(int u, int cur) {

        if (u == m) return set.contains(cur);

        for (int i = 0; i < 10; i++) {

            if (cnts[i] != 0) {

                cnts[i]--;

                if ((i != 0 || cur != 0) && dfs(u + 1, cur * 10 + i)) return true;

                cnts[i]++;

            }

        }

        return false;

    }

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kaitoxin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值