一个简单组合问题的算法

今天在 leetcode 上刷题的时候,刷到这样一道题,下面是这道题的链接,感兴趣的小伙伴也可以去尝试一下。https://leetcode.cn/problems/combinations/

题目大概就是:给定两个整数n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。乍一看这道题目,想到的就是一个个尝试任何一种可能,然后想到使用多个 for 循环,但是仔细一想,for 循环的个数是和 k 相等的,而 k 是一个变量,无法得知,这样也就不好写这么一个多重循环。最后看了题解,要用迭代法。下面记录下我偏好的解法。

0d87287f8a40a853ef8a09b762f5a2d3.jpeg

我们可以把问题等价于上面这张图,第 x 个数字,我们有两种可能的选择,即选择和不选择,从根节点到叶子节点所路过的路径,即是一种可能的选择的方案,总共有 2 的 n 次方个。然后我们从这些所有可能的方案中,挑选出那些只选择了 k 个数字的方案。

f8b4237b47b3f2aca85b6b8d83f0bfa7.jpeg

处理左子树的时候,我们向 ele 列表中添加当前的数字,然后判断 ele 是否达到了 k 的大小,如果达到了,我们就不再向下迭代,可以认为下面的数字都是不再选择的。例如,我们已经选择了 1 和 2,要求只选择两个数字,那么 3 和 4 就认为是不选择的,我们也不再向下迭代。处理完左子树的“选择”后,我们再处理右子树的“不选择”,此时就不再向 ele 列表里面添加元素,直接向下迭代。

755cc26e736912e4967120f06f7e1228.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_37657276

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值