package com.walegarrett.interview;
import java.util.ArrayList;
import java.util.List;
/**
* @Author WaleGarrett
* @Date 2021/2/27 17:53
*/
/**
* 题目描述:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
* candidates 中的数字可以无限制重复被选取。
*/
/**
* 解法:回溯法
*/
public class LeetCode_39 {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> result = new ArrayList<>();
List<Integer> list = new ArrayList<>();
dfs(candidates, target, 0, list, result);
return result;
}
public void dfs(int[] condidates, int target, int index, List<Integer> path, List<List<Integer>> result){
if(index == condidates.length)
return;
//找到一条路径
if(target == 0){
//注意:这里不能直接result.add(path),因为path是在回溯中会改变的,这样只存储了list的地址,地址是不变的。
result.add(new ArrayList<>(path));
return;
}
//跳过当前数
dfs(condidates, target, index+1, path, result);
//不跳过当前数
if(target - condidates[index] >= 0){
path.add(condidates[index]);
dfs(condidates, target-condidates[index], index, path, result);
path.remove(path.size()-1);
}
}
}
原文:https://www.cnblogs.com/GarrettWale/p/14456786.html