LeetCode 1780: Check if Number is a Sum of Powers of Three(2025/3/4 每日一题)
标题:1780. Check if Number is a Sum of Powers of Three
题目:
例:
Constraints: 1<=n<=1e7
解题思路:
1. 回溯法:看了下最大n是10的7次方,3的14.67次方。数据量可以支持回溯法来计算。这个没什么好解释的,就一个一个试呗,直接上代码:
class Solution {
public:
bool isPower(int n, int idx, int maxPower) {
if (n == 0) return true;
if (n < 0) return false;
for(int i = idx; i <= maxPower; i++) {
if (isPower(n-pow(3, i), i+1, maxPower)){
return true;
}
}
return false;
}
bool checkPowersOfThree(int n) {
int maxPower = (int)(log(n) / log(3));
return isPower(n, 0, maxPower);
}
};
测试也能过,但时间和空间惨不忍睹,是可忍孰不可忍,叔可忍婶也不可忍。。。于是开辟新思路。
2. 数学方法:
一个数是各种以3为底不同幂加和的话,可以将数字转为3进制的数字。则每一位可能是0,1,2。如果是0和1,都符合题意,如果有一位是2,则返回false。例:
12 转成 三进制数为 110 = pow(3, 2) + pow(3, 1) + 0; 则返回true;
21 转成三进制数为 210 = 2* pow(3, 2) + pow(3, 1) + 0 则返回false;
代码为:
class Solution {
public:
bool checkPowersOfThree(int n) {
while (n > 0) {
if ( n % 3 == 2) return false;
n /= 3;
}
return true;
}
};
时间复杂度 O(logN), 空间复杂度O(1)。
这个结果舒服了哈哈……