LeetCode 40 组合总和2(回溯法)

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

解决:

1.这个和39组合总和的差距在于每个数字只能使用一次
所以在回溯过程中,下一个起始位置不能是i,必须是i+1
2.如果相邻两个位置的元素相等,还有可能存在重复解
所以要对candidate[i]和candidate[i-1]进行判断剪枝

	List> result = new ArrayList>();
	public List> combinationSum2(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;
		}
		if(start == candidates.length){
			return;
		}
		
		//因为每一个位置的元素都不能重复使用,所以递归的下一个位置是i+1,  对于有重复数字的情况,结果也会重复,就采用剪枝操作.
		//如果target减去candidates[i]这个位置的结果小于0,则没有继续回溯的意义
		for(int i = start;i < candidates.length && target >= candidates[i];i++){
			if(i > start && candidates[i] == candidates[i-1]){
				continue;   //对于排序好的数组,剪掉分支
			}
			list.add(candidates[i]);
			backTrace(list,target-candidates[i],i+1,candidates);
			list.remove(list.size()-1);
		}
	}

你可能感兴趣的:(回溯法)