题目:
给你一个整数 n ,如果你可以将 n 表示成若干个不同的三的幂之和,请你返回 true ,否则请返回 false 。
对于一个整数 y ,如果存在整数 x 满足 ,我们称这个整数 y 是三的幂。
示例 1:
输入:n = 12
输出:true
解释:12 = 31 + 32
提示:
1 <= n <=
来源:
解题思路:回溯
将所有3的幂组成一个数组,从这个数组找出和为n的某几个数,与 和为target的数的组合 很相似有没有,拿过来照写即可。
- 3的幂的组数:提前计算各个幂的值组成一个数组,因为n小于10000000,计算至4782969即可,共15个数字。
- path:因为不用返回各个组合,只需返回有没有,所以path变量可以不定义。没有path,此题可算作递归问题。
- 结果满足条件:当前和与目标和一致
- 剪枝条件:当找到后,或者当前和+后续数字大于n时
代码如下:
static int nums[15] = {1,3,9,27,81,243,729,2187,6561,19683,59049,177147,531441,1594323,4782969};
class Solution {
public:
//vector<int> path;
bool ok;
bool checkPowersOfThree(int n) {
ok = false;
back(n, 0, 0);
return ok;
}
void back(int n, int sum, int start) {
if (n == sum) {
ok = true;
return;
}
for (int i = start; i < 15; i++) {
if (ok || sum + nums[i] > n) break;
//path.push_back(nums[i]);
back(n, sum + nums[i], i+1);
//path.pop_back();
}
}
};