Combination Sum III
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:
This is quite similar to the previous problems Combination Sum I and Combination Sum II, please refer these two problems. Basically DFS is enough to solve this problem.Code(C++):
class Solution {
public:
void search(vector<int> &candidates, int target, int i, int &k, vector<vector<int> >&res, vector<int> &ress){
if (target < 0){
return;
}else{
if (target == 0 && ress.size()==k){
res.push_back(ress);
}else{
for (int j=i;j<candidates.size();j++){
if (j==0 || candidates[j] != candidates[j-1]){
ress.push_back(candidates[j]);
search(candidates, target-candidates[j], j+1, k, res, ress);
ress.pop_back();
}
}
}
}
}
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int> >res;
vector<int> ress;
vector<int> candidates(9);
for (int i=1;i<=9;i++){
candidates[i-1] = i;
}
search(candidates, n, 0, k, res, ress);
return res;
}
};
Code(Python):
class Solution:
def search(self, candidates, target, i, k, res, ress):
if target < 0:
return
else:
if target == 0 and len(ress)==k:
res.append(ress[:]) #It is important to use "ress[:]" instead of "ress"
else:
for j in xrange(i, len(candidates)):
if j==0 or candidates[j] != candidates[j-1]:
ress.append(candidates[j])
self.search(candidates, target-candidates[j], j+1, k, res, ress)
ress.pop(-1) #if use "ress", this will pop the elemtnes in res also
# @param {integer} k
# @param {integer} n
# @return {integer[][]}
def combinationSum3(self, k, n):
res =[]
ress = []
self.search([1,2,3,4,5,6,7,8,9], n, 0, k, res, ress)
return res
This comment has been removed by the author.
ReplyDeleteif j==0 or candidates[j] != candidates[j-1] 这一行似乎没有必要
ReplyDeleteif (target < 0 || ress.size() > k){
ReplyDeletereturn;