虽然是中秋节,但是还要继续学习。
今天在 leetcode 上刷题的时候,又刷到一个组合的问题,下面是这道题的链接,感兴趣的小伙伴也可以去尝试一下。https://leetcode.cn/problems/combination-sum-iii/
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字1到9,每个数字 最多使用一次 。返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。
示例 2:
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解释:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
没有其他符合的组合了。
看到这个问题,我们还是可以归结为下图的选择逻辑,从 1 到 9 ,每个数字都可以选择或者不选择,如下图所示,当选择到 9 的时候,每个 root 到叶子节点的路径就是一种选择方案,如果该选择方案里面,只选择了 k 个数字,且这 k 个数字的和恰好为 n,则该方案是符合题意的一种组合。
根据这张图,我写了如下的解题方案:
处理左子树的时候,我们向 ele 列表中添加当前的数字,并将当前数字累加到 sum 里面,如果 sum 等于 n ,然后 ele 里面又恰好是 k 个数字,符合题意,记录当前的方案,后面的数字认为不再选择,例如,我们已经选择了 1 和 2,要求只选择两个数字,那么 3 和 4 就认为是不选择的,我们也不再向下迭代。处理完左子树的“选择”后,我们再处理右子树的“不选择”,此时就不再向 ele 列表里面添加元素,因为右子树是不选择,所以直接向下迭代。
运行结果:
最后:祝大家中秋节快乐!