[バックトラッキング] [leetcode]数値を3の累乗の合計として表現できるかどうかを判断します

トピック:

整数nを与えます。nを3のいくつかの異なる累乗の合計として表すことができる場合は、trueを返します。それ以外の場合は、falseを返します。

整数yの場合y = 3 ^ x、を満たす整数xがある場合、この整数yを3の累乗と呼びます。

例1:

入力:n = 12
出力:true
説明:12 = 31 + 32

促す:

  • 1 <= n <= 10 ^ 7

ソース:

1780.数値が3の累乗の合計として表現できるかどうかを判断する

問題解決のアイデア:バックトラック

3つすべてが累乗の配列で構成されており、配列からわかります。nは少数の数であり、非常に類似した組み合わせの目標数については、書き込みに従って引き継ぐことができます。

  • 3の累乗のグループの数:配列を形成するために事前に各累乗の値を計算します。nは10000000未満であるため、合計15の数値である4782969と計算できます。
  • パス:各組み合わせを返す必要がないため、あるかどうかを返すだけで、パス変数を定義する必要はありません。パスがないと、この問題は再帰的な問題としてカウントされる可能性があります
  • 結果は条件を満たしています:現在および目標と一致している
  • 剪定条件:見つかった場合、または現在および+後続の数値が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
おすすめ