組み合わせ数の合計2

トピック:

候補の配列とターゲット数のターゲットが与えられた場合、数の合計をターゲットにすることができる候補のすべての組み合わせを見つけます。
候補者の各番号は、各組み合わせで1回のみ使用できます。

説明:

すべての数値(ターゲット数値を含む)は正の整数です。
ソリューションセットに繰り返しの組み合わせを含めることはできません。

ここに画像の説明を挿入

分析:

最初の参照:
サブセットIを探していますサブセットII
探しています

この質問には、判断サブセットのサイズと条件のみが追加されています。

サブセットIIを探す方法に従い、最初にすべてのサブセットを見つけてから、ターゲットのサブセットとして要素の合計を見つけることができます。

しかし、繰り返しになり
ここに画像の説明を挿入ますが、
ここに画像の説明を挿入

コード:

class Solution {
    
    
    public List<List<Integer>> combinationSum2(int[] nums, int target) {
    
    
    List<List<Integer>> ans = new ArrayList<>();
    Arrays.sort(nums); //排序
    getAns(nums, 0, new ArrayList<>(), ans,0,target);
    return ans;
}

private void getAns(int[] nums, int start, ArrayList<Integer> temp, List<List<Integer>> ans, int sum,int target) {
    
    
     if(target==0){
    
    
       ans.add(new ArrayList<>(temp));
      return;
     }
    for (int i = start; i < nums.length; i++) {
    
    
        //和上个数字相等就跳过
        if (i > start && nums[i] == nums[i - 1]) {
    
    
            continue;
        }
        sum=sum+nums[i];
        if(sum>target){
    
      //剪枝操作
              return;
        }
         temp.add(nums[i]);
        if(target==sum){
    
       //符合要求,加入返回结果
           ans.add(new ArrayList<>(temp));
        }
        getAns(nums, i + 1, temp, ans,sum,target);
        temp.remove(temp.size() - 1);
        sum=sum-nums[i];

    }
}
}

出典:LeetCode
リンク:https ://leetcode-cn.com/problems/combination-sum-ii
著作権はLeetCodeが所有しています商用転載の場合は、公認機関にご連絡ください。非商用転載の場合は、出典を明記してください。

おすすめ

転載: blog.csdn.net/weixin_42120561/article/details/114270944
おすすめ