今天在 leetcode 上刷题的时候,刷到这样一道题,下面是这道题的链接,感兴趣的小伙伴也可以去尝试一下。https://leetcode.cn/problems/combinations/
题目大概就是:给定两个整数n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。乍一看这道题目,想到的就是一个个尝试任何一种可能,然后想到使用多个 for 循环,但是仔细一想,for 循环的个数是和 k 相等的,而 k 是一个变量,无法得知,这样也就不好写这么一个多重循环。最后看了题解,要用迭代法。下面记录下我偏好的解法。
我们可以把问题等价于上面这张图,第 x 个数字,我们有两种可能的选择,即选择和不选择,从根节点到叶子节点所路过的路径,即是一种可能的选择的方案,总共有 2 的 n 次方个。然后我们从这些所有可能的方案中,挑选出那些只选择了 k 个数字的方案。
处理左子树的时候,我们向 ele 列表中添加当前的数字,然后判断 ele 是否达到了 k 的大小,如果达到了,我们就不再向下迭代,可以认为下面的数字都是不再选择的。例如,我们已经选择了 1 和 2,要求只选择两个数字,那么 3 和 4 就认为是不选择的,我们也不再向下迭代。处理完左子树的“选择”后,我们再处理右子树的“不选择”,此时就不再向 ele 列表里面添加元素,直接向下迭代。