leecode---39---数组,dfs,回溯法---求所有的组合为target,数字无重复

给了个数组和目标值,要找到几个数字和为目标值。
dfs的时候入参有:总结果,当前数字记录,当前数字总和,数组,数组下标,目标值。
如果当前总和超过target,退出dfs
如果当前总和==target,记录结果
 
 

 
 
题意
给一个数组和target,求全部组合,其中数字可以重复使用,数组中没有重复数字
 
分析
 
 
 
代码
class Solution {
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        List<Integer> temp = new ArrayList<Integer>();
        if(candidates == null || candidates.length <= 0 || target < 0) return result;
        dfs(result,temp,candidates,0,0,target);
        return result;
    }
    
    public void dfs(List<List<Integer>> result,List<Integer> temp,int[] nums,int pos,int curSum,int target){
        //1.直接退出循环情况
        if (curSum > target) return;
        
        //2.结果情况
        if (curSum == target) {
            result.add(new ArrayList<Integer>(temp));
        }
        
        //3.普通情况---选择条件:因为数字可以重复使用且无重复,所以从pos到末尾都可以用
        //4.是否回溯---因为记录了路程,所以进行下一种选择的时候需要把上一种选择剔除掉。
        for (int i=pos; i < nums.length; i++) {
            temp.add(nums[i]);
            curSum+=nums[i];
            dfs(result,temp,nums,i,curSum,target);
            temp.remove(temp.size() - 1);
            curSum -= nums[i];
        }
    }
}
posted @ 2018-05-03 15:30  buptyuhanwen  阅读(457)  评论(0编辑  收藏  举报