📌  相关文章
📜  来自给定数字的唯一子序列的计数,它们是 2 的幂(1)

📅  最后修改于: 2023-12-03 15:10:41.929000             🧑  作者: Mango

计数2的幂的唯一子序列

问题描述:给定一个数字,计算其唯一子序列的数量,其中所有数字均为2的幂。

样例

输入:10

输出:11

解释:唯一的子序列为[1,2,4,8,10]

解法

当前数字可以被表示为2的幂的和,例如10可以表示为2^3 + 2^1即8+2。那么我们可以将其表示为二进制的形式。例如,10的二进制为1010,我们可以通过将该数字看作一些1和0的组合来将其表示为2的幂的和。例如,1010可以被表示为2^3+2^1。

我们可以使用一个int类型的变量来存储当前数字的二进制表示,并使用位运算来遍历其所有的二进制位。对于每个位,我们将其与1相与。如果该位上的值为1,我们就将其表示为2的幂。

代码
def countUniqueSubsequences(n: int) -> int:
    # 将数字n表示为二进制
    binary = bin(n)[2:]
    # 用一个数组存储当前数字可以表示为2的幂的和的情况
    nums = [0] * len(binary)
    for i in range(len(binary)):
        if binary[i] == "1":
            nums[i] = pow(2, len(binary)-i-1)
    # 寻找全部子序列
    res = set()
    def dfs(track, idx):
        if track:
            res.add(tuple(track))
        for i in range(idx, len(nums)):
            dfs(track + [nums[i]], i+1)
    dfs([], 0)
    return len(res)
性能

时间复杂度:O(2^n)

空间复杂度:O(n)

其中n是数字n的二进制位数。算法的性能取决于生成完整子序列的时间复杂度。由于一共有2^n个子序列,因此时间复杂度为O(2^n)。由于递归深度最大为n,因此空间复杂度为O(n)。