給定整數 n,判斷是否存在整數 k ≥ 0 使得 3^k = n。進階要求:不使用迴圈/遞歸。
class Solution {
public:
bool isPowerOfThree(int n) {
if (n < 1) return false;
while (n % 3 == 0) n /= 3;
return n == 1;
}
};
O(log₃ n),空間:O(1)。false。32 位有號整數最大值 2^31 - 1 = 2147483647。最大的 3 的冪為 3^19 = 1162261467。
若 n > 0 且 1162261467 % n == 0,則 n 為 3 的冪(因 3 為質數,其冪的約數只能是 3 的冪)。
class Solution {
public:
bool isPowerOfThree(int n) {
return n > 0 && 1162261467 % n == 0;
}
};
O(1),空間:O(1)。滿足進階要求。
bool isPowerOfThree(int n) {
if (n <= 0) return false;
double log3 = log10(n) / log10(3);
return abs(log3 - round(log3)) < 1e-10;
}
需處理浮點誤差,不如極值法穩健。
預計算所有 32 位範圍內的 3 的冪存入 unordered_set,查詢 O(1)。適用於多次查詢場景。
| 方法 | 時間 | 空間 | 備註 |
|---|---|---|---|
| 迴圈除法 | O(log n) | O(1) | 標準解法 |
| 極值取模 | O(1) | O(1) | 最優、無迴圈 |
| 對數法 | O(1) | O(1) | 浮點誤差風險 |
| 查表法 | O(1) | O(1) | 預計算 20 個值 |