蓝桥杯备赛练习(二) 组合总和III(JAVA)

题目来源Leetcode

题目:

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

说明:

  • 所有数字都是正整数。

解集不能包含重复的组合。 

示例1.

输入:k=3,n=7

输出:[[1,2,4]]

示例2.

输入:k=3,  n=9

输出:[[1,2,6],[1,3,5],[2,3,4]]

考点:深度搜索

class Solution {
    public List> combinationSum3(int k, int n) {
        List> res = new ArrayList>();
		List tmp = new ArrayList<>();
		dfs(res, 1, 0, tmp, n, k);
		return res;
	}
 
	private void dfs(List> res, int curIdx, int sum, List tmp, int n, int k) {
 
		if (sum > n)
			return;
		if (k < 0)
			return;
		if (sum == n && k == 0) {
			res.add(new ArrayList(tmp));
			return;
		}
		// For循环每次从curIdx开始,避免返回到之前的元素
		for (int i = curIdx; i < 10; i++) {
			// 剪枝
			if (n < sum)
				return;
			sum += i;
			tmp.add(i);
			// 传入i+1
			i++;
			dfs(res, i, sum, tmp, n, k - 1);
			// 回溯
			i--;
			tmp.remove(tmp.size() - 1);
			sum -= i;
		}
}
}

参考:https://blog.csdn.net/mine_song/article/details/69703969

你可能感兴趣的:(蓝桥杯)