326. 3 的幂
题目描述
给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x
示例 1:
输入:n = 27 输出:true
示例 2:
输入:n = 0 输出:false
示例 3:
输入:n = 9 输出:true
示例 4:
输入:n = 45 输出:false
提示:
-231 <= n <= 231 - 1
进阶:你能不使用循环或者递归来完成本题吗?
解法
方法一:试除法
思考
判断 \(n\) 是否为 \(3\) 的幂。连乘直到溢出再比较亦可,但试除更直接:在 \(n>2\) 时若不能被 \(3\) 整除则否,否则除以 \(3\)。最终只剩 \(1\) 则为是。\(n\le 1\) 的情况自然落到最后的相等判断。
如果 \(n \gt 2\),我们可以不断地将 \(n\) 除以 \(3\),如果不能整除,说明 \(n\) 不是 \(3\) 的幂,否则继续除以 \(3\),直到 \(n\) 小于等于 \(2\)。如果 \(n\) 等于 \(1\),说明 \(n\) 是 \(3\) 的幂,否则不是 \(3\) 的幂。
时间复杂度 \(O(\log_3n)\),空间复杂度 \(O(1)\)。
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
方法二:数学
思考
试除需 \(O(\log n)\) 次除法。\(32\) 位内最大 \(3\) 的幂为 \(3^{19}=1162261467\),正整数 \(n\) 为 \(3\) 的幂当且仅当它整除该值。一次取模即可。
如果 \(n\) 是 \(3\) 的幂,那么 \(n\) 最大是 \(3^{19} = 1162261467\),因此我们只需要判断 \(n\) 是否是 \(3^{19}\) 的约数即可。
时间复杂度 \(O(1)\),空间复杂度 \(O(1)\)。
1 2 3 | |
1 2 3 4 5 | |
1 2 3 4 5 6 | |
1 2 3 | |
1 2 3 | |
1 2 3 4 5 | |
1 2 3 4 5 6 7 | |