回溯2.求所有和为t的数字组合
程序员文章站
2022-05-21 23:17:19
...
给的是无重复数组和目标数,数组中的数可以无限被选取,比如说其中有个2,目标值是6,则可以用3个2。
用的就是回溯加剪枝,这类问题需要画出树形图,也就是遍历到2的时候,targrt-2如果已知,则可以直接算出。实现的时候用深度优先搜索DFS,找到一支则记录。
用节点值表示此时target剩下的数时,当叶子节点为0时意味着符合情况。
但全部遍历的话一定会出现重复,比如在数组中若有2,和3.因为先减2,然后减3,和先减3然后减2是不一样的,是两条路,那怎么避免这种重复呢,就是在前面遍历的时候其实已经遍历过所有有2的情况,那么在target减3的时候就不考虑减2的情况,也就是在一轮搜索结束后设置下一轮搜索开始的起点。
用栈来存储这种路径,如果发现成立则输入到结果集中。
递归求所有的路径即可。
import java.util.ArrayList;
import java.util.Stack;
class Solution {
List<List<Integer>> res =new ArrayList<List<Integer>>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
if(candidates==null || candidates.length==0){
return res;
}
Stack<Integer> s=new Stack<>();
core(candidates,target,0,s);
return res;
}
public void core(int[] candidates,int target,int begin,Stack s){
if(target<0){
return;
}
if(target==0){
res.add(new ArrayList(s));
return;
}
for(int i=begin;i<candidates.length;i++){
s.push(candidates[i]);
core(candidates,target-candidates[i],i,s);
s.pop();
}
}
}
上一篇: 简易雷达避障效果实现
下一篇: 图的遍历——dfs与
推荐阅读