【每日一题-leetcode】39. 组合总和

39. 组合总和

  1. 组合总和

难度中等763

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

candidates 中的数字可以无限制重复被选取。

说明:

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

示例 1:

输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
  [7],
  [2,2,3]
]
		// 剪枝+回溯  
        public List<List<Integer>> combinationSum(int[] candidates, int target) {
     
            List<List<Integer>> res = new ArrayList<>();
            int len = candidates.length;
    
            Arrays.sort(candidates);//提前终止所搜索
            dfs(candidates,len,target,0,new ArrayDeque<>(),res);
            return res;
        }
    
        /***
        *
            len = 长度
            residue = 剩余数值
            begin =开始起点
            path = 路径
            res = 结果集变量
        */
        private void dfs(int [] candidates,int len,int residue,int begin,Deque<Integer> path,List<List<Integer>> res){
     
            if(residue == 0){
     
                res.add(new ArrayList<>(path));
                return;
            }
    
            for(int i=begin;i<len;i++){
     
                //剪枝操作
                if(residue - candidates[i] < 0){
     
                    break;
                }
    
                path.addLast(candidates[i]);//记录路径
                dfs(candidates,len,residue-candidates[i],i,path,res);
                path.removeLast();//撤销选择
            }
        }

你可能感兴趣的:(#,leetcode,#,回溯算法)