Find all valid combinations of k numbers that sum up to n such that the following conditions are true:
Only numbers 1 through 9 are used.
Each number is used at most once.
Return a list of all possible valid combinations. The list must not contain the same combination twice, and the combinations may be returned in any order.
Example 1:
Input: k = 3, n = 7
Output: [[1,2,4]]
Explanation:
1 + 2 + 4 = 7
There are no other valid combinations.
Example 2:
Input: k = 3, n = 9
Output: [[1,2,6],[1,3,5],[2,3,4]]
Explanation:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
There are no other valid combinations.
Example 3:
Input: k = 4, n = 1
Output: []
Explanation: There are no valid combinations.
Using 4 different numbers in the range [1,9], the smallest sum we can get is 1+2+3+4 = 10 and since 10 > 1, there are no valid combination.
We design a function \(dfs(i, s)\), which represents that we are currently enumerating the number \(i\), and there are still numbers with a sum of \(s\) to be enumerated. The current search path is \(t\), and the answer is \(ans\).
The execution logic of the function \(dfs(i, s)\) is as follows:
Approach One:
If \(s = 0\) and the length of the current search path \(t\) is \(k\), it means that a group of answers has been found. Add \(t\) to \(ans\) and then return.
If \(i \gt 9\) or \(i \gt s\) or the length of the current search path \(t\) is greater than \(k\), it means that the current search path cannot be the answer, so return directly.
Otherwise, we can choose to add the number \(i\) to the search path \(t\), and then continue to search, i.e., execute \(dfs(i + 1, s - i)\). After the search is completed, remove \(i\) from the search path \(t\); we can also choose not to add the number \(i\) to the search path \(t\), and directly execute \(dfs(i + 1, s)\).
implSolution{#[allow(dead_code)]pubfncombination_sum3(k:i32,n:i32)->Vec<Vec<i32>>{letmutret=Vec::new();letmutcandidates=(1..=9).collect();letmutcur_vec=Vec::new();Self::dfs(n,k,0,0,&mutcur_vec,&mutcandidates,&mutret);ret}#[allow(dead_code)]fndfs(target:i32,length:i32,cur_index:usize,cur_sum:i32,cur_vec:&mutVec<i32>,candidates:&Vec<i32>,ans:&mutVec<Vec<i32>>,){ifcur_sum>target||cur_vec.len()>(lengthasusize){// No answer for thisreturn;}ifcur_sum==target&&cur_vec.len()==(lengthasusize){// We get an answerans.push(cur_vec.clone());return;}foriincur_index..candidates.len(){cur_vec.push(candidates[i]);Self::dfs(target,length,i+1,cur_sum+candidates[i],cur_vec,candidates,ans,);cur_vec.pop().unwrap();}}}
If \(s = 0\) and the length of the current search path \(t\) is \(k\), it means that a group of answers has been found. Add \(t\) to \(ans\) and then return.
If \(i \gt 9\) or \(i \gt s\) or the length of the current search path \(t\) is greater than \(k\), it means that the current search path cannot be the answer, so return directly.
Otherwise, we enumerate the next number \(j\), i.e., \(j \in [i, 9]\), add the number \(j\) to the search path \(t\), and then continue to search, i.e., execute \(dfs(j + 1, s - j)\). After the search is completed, remove \(j\) from the search path \(t\).
In the main function, we call \(dfs(1, n)\), i.e., start enumerating from the number \(1\), and the remaining numbers with a sum of \(n\) need to be enumerated. After the search is completed, we can get all the answers.
The time complexity is \((C_{9}^k \times k)\), and the space complexity is \(O(k)\).
We can use a binary integer of length \(9\) to represent the selection of numbers \(1\) to \(9\), where the \(i\)-th bit of the binary integer represents whether the number \(i + 1\) is selected. If the \(i\)-th bit is \(1\), it means that the number \(i + 1\) is selected, otherwise, it means that the number \(i + 1\) is not selected.
We enumerate binary integers in the range of \([0, 2^9)\). For the currently enumerated binary integer \(mask\), if the number of \(1\)s in the binary representation of \(mask\) is \(k\), and the sum of the numbers corresponding to \(1\) in the binary representation of \(mask\) is \(n\), it means that the number selection scheme corresponding to \(mask\) is a group of answers. We can add the number selection scheme corresponding to \(mask\) to the answer.
The time complexity is \(O(2^9 \times 9)\), and the space complexity is \(O(k)\).