组合数之和2

题目:

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。

说明:

所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。

在这里插入图片描述

解析:

先参考:
求子集I
求子集II

这道题只是加入了一个判断 子集和大小 的条件。

我们可以按照求子集II的方法,先将所有子集找出来,再找出元素和为target的子集。

但是又因为:
在这里插入图片描述所以我们可以
在这里插入图片描述

代码:

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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/weixin_42120561/article/details/114270944