39. 组合总和

思路: 使用dfs递归实现的深度优先搜索来实现对数据的查找

通过对原数组进行排序来实现剪枝

代码:

/** * @Description: 使用dfs递归来实现的深度优先搜索来进行数据的查找 * @auther: DaleyZou * @date: 17:11 2018-8-22 * @param: candidates * @param: target * @return: java.util.List<java.util.List<java.lang.Integer>> */
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> resultList = new ArrayList<>();
        List<Integer> result = new ArrayList<>();
        Arrays.sort(candidates); // 剪枝
        dfs(candidates, resultList, result, 0, target);
        return resultList;
    }

    private void dfs(int[] candidates, List<List<Integer>> resultList, List<Integer> result, int start, int target) {
        if (target < 0){            // target不符合
            return;
        }else if (target == 0){   // target符合
            resultList.add(new ArrayList<>(result));
        }else {                  // 继续进行数的查找
            for (int i = start; i < candidates.length; i++){
                if (target - candidates[i] >= 0){
                    result.add(candidates[i]);
                    dfs(candidates, resultList, result, i, target - candidates[i]);
                    result.remove(result.size() - 1);     // 数查找完后要进行回溯
                }else {
                    break;
                }
            }
        }
    }
点赞