Problem:
Find all possible combinations of k numbers that add up to a number n, 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]]
Analysis:
本题的要点在于如何理解不同的组合。题目并没有明确的表述。如果在面试的时候需要和面试官沟通。
从测试例子的角度看,有效的组合要求:(a)元素个数为k (b)和等于n (c)按从小到大排列 (d)不能有重复的元素。同样的,结果集合中也不能有重复的元素。解答的搜索方法是每次都从比上一次搜索到的值小1的值开始搜索。(当然要保证这个值小于9)
Solution:
C++:
void GetCombination(int k, int n, int end, vector<int> candidate, vector<vector<int> >& results)
{
if(k ==0 && n == 0) {
sort(candidate.begin(), candidate.end());
results.push_back(candidate);
} else if(k > 0) {
for(int i = end; i >= 1; --i) {
candidate.push_back(i);
GetCombination(k - 1, n - i, min(*(candidate.end() - 1) - 1, 9), candidate, results);
candidate.erase(candidate.end() - 1);
}
}
return;
}
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int> > results;
vector<int> candidate;
GetCombination(k, n, n > 9 ? 9 : n, candidate, results);
return results;
}