欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

回溯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();
        }
    }
}