2021/04/06
题目描述
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
实现
impl Solution {
pub fn combination_sum3(k: i32, n: i32) -> Vec<Vec<i32>> {
let arr = vec![1, 2, 3, 4, 5, 6, 7, 8, 9];
let mut vis: Vec<_> = arr.iter().map(|i| false).collect();
let mut result = vec![];
Solution::combination_sum0(k as usize, n, &arr, &mut vis, &mut vec![], &mut result);
return result;
}
fn combination_sum0(k: usize, target: i32, arr: &Vec<i32>, vis: &mut Vec<bool>, collector: &mut Vec<i32>, result: &mut Vec<Vec<i32>>) {
if collector.len() == k {
if target == 0 {
result.push(collector.clone());
}
return;
}
for (idx, item) in arr.iter().enumerate() {
// 已经使用过 || 会溢出
if vis[idx] || target - item < 0 {
continue;
}
// 保证结果升序
if let Some(last) = collector.last() {
if last > item {
continue;
}
}
vis[idx] = true;
collector.push(*item);
Solution::combination_sum0(k, target - item, arr, vis, collector, result);
collector.pop();
vis[idx] = false;
}
}
}