【LeetCode】377。コンビネーションサムIV(ミディアム)(JAVA)

【LeetCode】377。コンビネーションサムIV(ミディアム)(JAVA)

件名アドレス:https//leetcode.com/problems/combination-sum-iv/

タイトル説明:

すべて正の数で重複のない整数配列が与えられた場合、正の整数ターゲットになる可能性のある組み合わせの数を見つけます。

例:

nums = [1, 2, 3]
target = 4

The possible combination ways are:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)

Note that different sequences are counted as different combinations.

Therefore the output is 7.

フォローアップ:
指定された配列で負の数が許可されている場合はどうなりますか?
それはどのように問題を変えますか?
負の数を許可するには、質問にどのような制限を追加する必要がありますか?

クレジット:
この問題を追加し、すべてのテストケースを作成してくれた@pbrotherに特に感謝します。

一般的なアイデア

正の整数で構成され、繰り返しの数がない配列が与えられた場合、合計が指定されたターゲットの正の整数である組み合わせの数を見つけます。

詳細:
指定された配列に負の数が含まれている場合はどうなりますか?
問題はどのように変わりますか?
負の数を表示するには、質問にどのような制限を追加する必要がありますか?

問題解決方法

  1. この質問はコインの質問に似ています。いくつの交換方法が利用できるかを確認するためにお金を与えてください。
  2. 動的計画法を使用して、関数dp [i]は、合計がiの場合に存在するアルゴリズムの総数を示します。
  3. dp [i]の計算方法は?nums配列をトラバースできます。さらに、dp [i-nums [j]]のアルゴリズムは次のとおりです。dp[i] + = dp [i-nums [j]]
class Solution {
    public int combinationSum4(int[] nums, int target) {
        Arrays.sort(nums);
        int[] dp = new int[target + 1];
        dp[0] = 1;
        for (int i = 1; i <= target; i++) {
            for (int j = 0; j < nums.length && nums[j] <= i; j++) {
                dp[i] += dp[i - nums[j]];
            }
        }
        return dp[target];
    }
}

実行時間:2ミリ秒、Javaユーザーの36.87%を打ち負かす
メモリ消費量:35.6 MB、Javaユーザーの88.05%を打ち負かす

私の公式アカウントに注意を払うことを歓迎します、LeetCodeは毎日1つの質問を更新します

おすすめ

転載: blog.csdn.net/qq_16927853/article/details/111660622