题目:
Find all possible combinations of k numbers that add up to a numbern, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.
Ensure that numbers within the set are sorted in ascending order.
Example 1:
Input: k = 3, n = 7
Output:
[[1,2,4]]
Example 2:
Input: k = 3, n = 9
Output:
[[1,2,6], [1,3,5], [2,3,4]]
题解:
典型的backtracking。注意每次递归是只用传进比当前使用数大的数,以避免重复和无序。
C++版:
class Solution {
public:
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int>> results;
if(k < 1 || n < 1 || k * 9 <= n)
return results;
set<int> number;
for(int i = 1; i <= 9; i++)
number.insert(i);
vector<int> result;
for(int i = 1; i <= 9; i++) {
result.push_back(i);
auto ub = number.upper_bound(i);
set<int> newNumber(ub, number.end());
sumRe(result, results, newNumber, k-1, n-i);
result.pop_back();
}
return results;
}
void sumRe(vector<int> result, vector<vector<int>>& results, set<int> number, int k, int n) {
vector<int> local = result;
if(k == 1) {
if(number.find(n) != number.end()) {
local.push_back(n);
results.push_back(local);
}
return;
}
for(auto i : number) {
local.push_back(i);
auto ub = number.upper_bound(i);
set<int> newNumber(ub, number.end());
sumRe(local, results, newNumber, k-1, n-i);
local.pop_back();
}
}
};
Java版:
import java.util.SortedSet;
public class Solution {
public List<List<Integer>> combinationSum3(int k, int n) {
List<List<Integer>> results = new ArrayList<List<Integer>>();
if(k < 1 || n < k || k * 9 <= n)
return results;
List<Integer> result = new ArrayList<>();
SortedSet<Integer> number = new TreeSet<>();
for(int i = 1; i <= 9; i++)
number.add(i);
for(int i = 1; i <= 8; i++) {
result.add(i);
sumRe(results, result, number.subSet(i+1, 10), k - 1, n - i);
result.clear();
}
return results;
}
void sumRe(List<List<Integer>> results, List<Integer> result, SortedSet<Integer> number, int k, int n) {
if(k == 1) {
if(number.contains(n)) {
result.add(n);
List<Integer> local = new ArrayList<>();
for(Integer i : result)
local.add(i);
results.add(local);
result.remove(result.indexOf(n));
}
return;
}
for(int i = number.first(); i <= 8; i++) {
result.add(i);
sumRe(results, result, number.subSet(i+1, 10), k - 1, n - i);
result.remove(result.indexOf(i));
}
}
}
Python版:
class Solution:
def __init__(self):
self.x = []
self.r = []
# @param {integer} k
# @param {integer} n
# @return {integer[][]}
def combinationSum3(self, k, n):
if k == 1:
return [n]
if k * 9 <= n:
return []
number = [1,2,3,4,5,6,7,8,9]
for i in number:
self.r.append(i)
self.sumRe(self.r, k-1, n-i, number[number.index(i) + 1:])
self.r.remove(i)
return list(sorted(self.x))
def sumRe(self, r, k, n, number):
if k == 1:
if n in number:
self.r.append(n)
self.x.append(self.r)
self.r = self.r[:-1]
return
for i in number:
self.r.append(i)
self.sumRe(self.r, k-1, n-i, number[number.index(i) + 1:])
self.r = self.r[:-1]