1780. 判断一个数字是否可以表示成三的幂的和

目录

判断一个数能否表示成不同的三的幂之和 — 解题思路与代码实现

题目描述

示例

解题分析

代码实现

方法分析与比较

示例说明

总结


判断一个数能否表示成不同的三的幂之和 — 解题思路与代码实现

题目描述

给定一个整数 n,判断是否存在若干个 不同的三的幂 (即 3^0=1, 3^1=3, 3^2=9, \ldots )的和,使得这些三的幂相加等于 n

具体来说,题目要求:

如果存在一组不同的整数 x_1, x_2, \ldots, x_k ,使得 n = 3^{x_1} + 3^{x_2} + \cdots + 3^{x_k}

返回 true;否则返回 false


示例

输入

输出

解释

12

true

12 =3^1 + 3^2 = 3 + 9

91

true

91 =3^0 + 3^2 + 3^4 = 1 + 9 + 81

21

false

无法用不同的三的幂表示21


解题分析

这题的关键点是理解 三的幂的和三进制表示法 之间的关系。

  • 三的幂有且只有 1 个对应三进制的位:3^0 对应三进制的个位,3^1 对应三进制的十位,依次类推。
  • 若某个数 n 可以表示成不同的三的幂之和,那么它的三进制表示中,每一位数字只能是0或1
  • 如果三进制表示中某一位出现数字 2,就表示需要用两个相同的三的幂相加(例如 2 \times 3^k),这不符合“不同三的幂”的要求。

因此,我们可以用简单的三进制检测法来解决问题:

  1. 将数字 n 按三进制拆解,一次取余 n % 3
  2. 如果某一位余数为 2,则返回 false
  3. 如果全部位余数都为 0 或 1,且最终 n 除完变为0,则返回 true

代码实现

class Solution:
    def checkPowersOfThree(self, n: int) -> bool:
        while n > 0:
            if n % 3 == 2:
                return False
            n //= 3
        return True

方法分析与比较

方法

复杂度分析

优缺点

三进制检测法(取余法)

时间复杂度 O(\log_3 n)

简单易实现,无需预先计算三的幂;代码简洁;高效

预生成三的幂数组,回溯法

时间复杂度较高

代码复杂;对于较大 n

不够高效;适合做穷举解题思路演示

这里的取余法明显更简洁且性能更好,因为它只需不断除以3并检测余数,不用存储或枚举所有三的幂。


示例说明

  • 输入:n = 12 
    • 12_{10} = 110_3(三进制)
    • 三进制位为 0 和 1,没有 2,符合条件,返回 true
    • 对应三的幂: 3^2 + 3^1 = 9 + 3 = 12
  • 输入:n = 91 
    • ​​​​​​​​​​​​​​91_{10} = 10101_3
    • 三进制各位均为0或1,返回 true
    • 对应三的幂: 3^4 + 3^2 + 3^0 = 81 + 9 + 1 = 91
  • 输入:n = 21
    • ​​​​​​​21_{10} = 210_3
    • 三进制中包含 2,说明需要重复使用某个三的幂,返回 false

总结

这道题利用了三进制的性质巧妙地解决了“不同三的幂相加”的问题。核心思想是用数字的三进制表示来判断是否存在重复的三的幂,算法简单且效率极高。

你可以利用这个思路扩展到类似的题目,比如判断是否可以表示为不同的二的幂(即判断是否为二进制数中只含0和1的数字)等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值