【回溯】【leetcode】判断一个数字是否可以表示成三的幂的和

题目:

给你一个整数 n ,如果你可以将 n 表示成若干个不同的三的幂之和,请你返回 true ,否则请返回 false 。

对于一个整数 y ,如果存在整数 x 满足y=3^x ,我们称这个整数 y 是三的幂。

示例 1:

输入:n = 12
输出:true
解释:12 = 31 + 32

提示:

  • 1 <= n <= 10^7

来源:

1780. 判断一个数字是否可以表示成三的幂的和

解题思路:回溯

将所有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();
        }
    }
};

猜你喜欢

转载自blog.csdn.net/hbuxiaoshe/article/details/115048058