Leetcode汇总贴: leetcode经典编程题目(Java实现)
leetcode题目
组合总和III -- leetcode 216
题目描述
找出所有相加之和为 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]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
回溯算法
代码
package com.leetcode.array;
import java.util.ArrayList;
import java.util.List;
/**
* 题目:
* 组合总和III -- leetcode 216
*
* 题目描述:
*
找出所有相加之和为 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]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
public class CombinationSumIII {
/**
* 思路:
* 1、回溯算法
*/
public List> combinationSum3(int k, int n) {
List> res = new ArrayList<>();
if (k <= 0) {
return res;
}
addCombinations(1, k, n, new ArrayList(), res);
return res;
}
private void addCombinations(int start, int k, int n, List cache, List> res) {
if (n < 0) {
return;
}
if (n == 0 && cache.size() == k) {
res.add(new ArrayList<>(cache));
}
for (int i=start; i<=9; i++) {
if (n < i) {
return;
}
cache.add(i);
addCombinations(i+1, k, n-i, cache, res);
cache.remove(cache.size()-1);
}
}
}