找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

所有数字都是正整数。
解集不能包含重复的组合。 
示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]

 

思路:

和前两题差不多  都可以用回溯法进行求解 因为不能重复 所以需要start  下一次递归都从start+1开始

贴代码:

// k个数 和为n
	public static List<List<Integer>> combinationSum3(int k, int n) {
		List<List<Integer>> res = new ArrayList<List<Integer>>();
		if (k < 1 || n < 1) {
			return res;
		}
		ArrayList<Integer> list = new ArrayList<>();
		// 回溯递归
		backtrack(k, n, res, list, 1);
		return res;
	}

	private static void backtrack(int k, int target, List<List<Integer>> res, ArrayList<Integer> list, int start) {
		//先判断
		if (target == 0 && k == 0) {
			res.add(new ArrayList<>(list));
			return;
		}
		if (target < 0 || k <= 0)  //后判断 因为都有k=0情况
			return;
		for (int i = start; i <= 9 && target >= i; i++) {
			list.add(i);
			backtrack(k - 1, target - i, res, list, i + 1);
			list.remove(list.size() - 1);
		}

	}

可以将这三道题结合看  就会有回溯的一点感悟。