LeetCode 216组合总和3(回溯法)

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

class Solution {
    public List> combinationSum3(int k, int n) {
        
    }
}

解决:

1.什么时候返回?
记录的值已经为三个,等于n就放入结果集中
不等于n就返回
2.注意1-9的范围

	//记录结果的集
	List> result = new ArrayList<>();
	
	public List> combinationSum3(int k,int n){
		backTrace(k,n,0,n,new ArrayList());
		return result;
	}
	
	/**
	 * n为目标值
	 * 要求k个数相加和为n
	 * curNum为目前list.size()个数相加的数的和
	 * @param k
	 * @param n
	 * @param curNum
	 */
	private void backTrace(int k,int n,int curNum,int start,List list){
		//目前已经添加够了k个数字,就判断curNum的值.然后返回
		if(list.size() == k){
			if(curNum == n){
				result.add(new ArrayList<>(list));
			}
			return;
		}
		
		//如果list中的数据不够k个的话继续添加
		//因为数据不能重复使用,所以下一个遍历开始的start就是i-1
		//因为只能包含1-9的数字,所以start最大只能是9
		start = start > 9 ? 9 : start;
		for(int i = start; i >=1 ;i--){
			list.add(i);
			backTrace(k,n,curNum+i,i-1,list);
			list.remove(list.size()-1);
		}
	}

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