LeetCode 39 组合总和(回溯法)

LeetCode 39 组合总和(回溯法)_第1张图片
LeetCode 39 组合总和(回溯法)_第2张图片

class Solution {
    public List> combinationSum(int[] candidates, int target) {
        
    }
}

解决:

LeetCode 39 组合总和(回溯法)_第3张图片
1.对于第一个例子
对target 7 分别减去每一个数组中元素后剩余为5,4,1,0
2.然后对剩余值再次进行同样减去数组中每一个元素
3.对得到的结果进行分析,如果为0则计入结果集中,
如果小于0,则不用继续回溯,直接返回

注意:1.先对数组进行排序,就不会出现重复结果的现象
2.因为每一个数字可以重复使用,所以下一个遍历的起点就是当前i
如果是0的话就像图中红色部分的2,结果集中会出现[2,2,3],[3,2,2]重复结果

	List> result = new ArrayList>();
	public List> combinationSum(int[] candidates,int target){
		//先对数据做排序,就可以去掉重复情况
		Arrays.sort(candidates);
		
		//System.out.print(Arrays.toString(candidates));
		//用来存储每一组正确答案
		List list = new ArrayList<>();
		
		//进行回溯的过程
		backTrace(list,target,0,candidates);
		return result;
	}
	
	private void backTrace(List list, int target,int start, int[] candidates){
		//什么时候可以存入结果中?当回溯的target为0的时候
		if(target == 0){
			result.add(new ArrayList<>(list));
			return;
		}
		
		//因为每一个位置的元素都可以重复使用,所以下一个遍历的起位置是当前i
		//如果target减去candidates[i]这个位置的结果小于0,则没有继续回溯的意义
		for(int i = start;i < candidates.length && target >= candidates[i];i++){
			list.add(candidates[i]);
			backTrace(list,target-candidates[i],i,candidates);
			list.remove(list.size()-1);
		}
	}

你可能感兴趣的:(LeetCode 39 组合总和(回溯法))