39.组合总和——回溯+剪枝

39.组合总和

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。

说明:

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

示例 1:
输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
  [7],
  [2,2,3]
]
示例 2:

输入:candidates = [2,3,5], target = 8,
所求解集为:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]
	public List<List<Integer>> combinationSum(int[] candidates, int target) {
    
    
        List<List<Integer>> ans = new ArrayList<>();
        int len = candidates.length;
        if (len <= 0 ) return ans;
        Arrays.sort(candidates);
        Deque<Integer> combine  = new ArrayDeque<>();//双端队列
        dfsCombinetionSum(candidates,target,len,ans,combine,0);
        return ans;
    }

    private void dfsCombinetionSum(int[] candidates, int target, int len, List<List<Integer>> ans, Deque<Integer> combine, int begin) {
    
    
        if (target == 0){
    
    
            ans.add(new ArrayList<>(combine));
            return;
        }
        for (int i = begin; i < len; i++) {
    
    
        	//剪枝
            if (target-candidates[i] < 0 ){
    
    
                break;
            }
            combine.addLast(candidates[i]);
            dfsCombinetionSum(candidates,target-candidates[i],len,ans,combine,i);
            combine.removeLast();
        }
    }

猜你喜欢

转载自blog.csdn.net/weixin_45636641/article/details/108519688
今日推荐