题目来源:LeetCode326:3的幂
问题抽象: 给定一个整数 n
(32 位有符号整数),要求判断该数是否为 3 的幂(即存在整数 k
使得 n = 3^k
),满足以下核心需求:
-
幂次定义:
- 严格等式:需满足
n = 3^k
(k
为非负整数); - 整数范围:
n
为 32 位有符号整数(值域-2^{31} ≤ n ≤ 2^{31}-1
)。
- 严格等式:需满足
-
输出要求:
- 返回布尔值
true
(是 3 的幂)或false
(不是 3 的幂); - 结果需严格匹配数学定义(无近似计算)。
- 返回布尔值
-
计算约束:
- 时间复杂度 O(1)(有限次数学运算,因 3 的最大幂次
3^{19} = 1162261467 < 2^{31}
); - 空间复杂度 O(1)(仅用常量级额外空间);
- 禁止使用对数或浮点运算(避免精度误差)。
- 时间复杂度 O(1)(有限次数学运算,因 3 的最大幂次
-
边界处理:
- 非正数处理:
n ≤ 0
时直接返回false
(3 的幂恒为正); - 特殊值验证:
n = 1
→true
(3^0 = 1
);n = 3
→true
;n = 2
→false
;
- 最大幂次:
n = 1162261467
(3^{19}
)→true
; - 超出范围:
n > 1162261467
时必为false
(如3^{20} > 2^{31}
)。
- 非正数处理:
输入:整数 n
输出:布尔值(true
/false
)
解题思路
- 数学性质利用:
- 在整数范围内,最大的 3 的幂次是 319 = 1162261467)(因为 320 = 3486784401已超过 231-1 = 2147483647)。
- 若
n
是 3 的幂,则它必须是 319 的约数(即 162261467 mod n = 0)。
- 边界处理:
- 3 的幂必须是正数,因此
n <= 0
时直接返回false
。
- 3 的幂必须是正数,因此
- 高效判定:
- 结合上述两点,只需检查
n > 0
且 1162261467 mod n = 0 即可。
- 结合上述两点,只需检查
时间复杂度:O(1),无循环或递归。空间复杂度:O(1),仅用常量空间。
代码实现(Java版)
class Solution {
public boolean isPowerOfThree(int n) {
// 边界条件:3的幂必须是正数
if (n <= 0) {
return false;
}
// 数学性质:n必须整除最大3的幂(3^19=1162261467)
return 1162261467 % n == 0;
}
}
代码说明:
- 边界检查:
n <= 0
时直接返回false
,因为 3 的幂不可能为负数或零。 - 核心判定:利用 (3^{19} = 1162261467) 的特性,若
n
是 3 的幂,则必能整除 (1162261467)。 - 高效性:避免了循环或递归,直接通过一次取模运算完成判定。