1. 程式人生 > >leetcode216_組合總數3---回溯法

leetcode216_組合總數3---回溯法

找出所有相加之和為 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);
		}

	}

可以將這三道題結合看  就會有回溯的一點感悟。