YSMull
<-- algorithm



原题链接

题目描述

找出所有相加之和为 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;
        }
    }
}