39. 组合总和
数组的值无限制重复被选取
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
if(candidates.length == 0)return res;
backtracking(candidates , target , 0);
return res;
}
public void backtracking(int[] candidates , int target, int index){
// 目标值小于0说明 答案不对跳出
if(target < 0)return;
if(target == 0){
res.add(new ArrayList(list));
return;
}
for(int i = index ; i < candidates.length; i++){
list.add(candidates[i]);
backtracking(candidates , target - candidates[i] , i ); //无限取值使用i
list.removeLast();
}
}
}
没有利用到sum参数,直接把target值减去加进来的数值即可
40.组合总和II
数值不能重复出现
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
// 关键:对数组排序,方便查找重复值
Arrays.sort(candidates);
backtracking(candidates , target , 0 );
return res;
}
public void backtracking(int[] candidates , int target , int index){
if( target == 0){
res.add(new ArrayList(list));
return;
}
for(int i = index ; i < candidates.length; i++){
// 超过目标值则跳出循环
if(target - candidates[i] < 0)break;
// 把重复的数值剪纸处理
if(i > index && candidates[i] == candidates[i - 1])continue;
list.add(candidates[i]);
backtracking(candidates , target -candidates[i], i + 1 );
list.removeLast();
}
}
}
i+1 表示进入下一层
47.全排列 II
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
public List<List<Integer>> permuteUnique(int[] nums) {
if(nums.length == 0)return res;
// 构建bool数组
boolean used[] = new boolean[nums.length];
// 对数组排序
Arrays.sort(nums);
backtracking(nums , 0 , used);
return res;
}
public void backtracking(int[] nums,int index,boolean [] used){
if(index == nums.length){
res.add(new ArrayList(list));
return;
}
for(int i = 0; i < nums.length ; i++){
if(used[i] == true)continue; // 判断数值是否使用过
if(i > 0 && nums[i] == nums[i - 1] && !used[i -1])continue; //剪枝处理
list.add(nums[i]);
used[i] = true;
backtracking(nums, index + 1, used);
used[i] = false;
list.removeLast();
}
}
}
index + 1 表示 任意顺序即可,
- 如果是i ,则是无限取值
- 如果是i+1,则数值只出现一次,且排序唯一
- 如果是index+1,则顺序不唯一,返回所有顺序