以该组合为例,由于我们需要在n=4个数中选取k=4个数,所以需要提前判断剩余的长度是否满足题目要求,优化效率。
图中高度代表递归次数,宽度代表for循环次数,我们能优化的部分只有for循环的循环条件。
已经选择的元素个数:path.size()
待选的元素个数:(k - path.size())
组合n中能够满足条件“还存在足够k个元素”的最终位置:n - (k - path.size()) + 1
例如,在该例中已经开始搜索第三层,此时path中已经存储了2个数,待选元素为2,组合n中能够满足条件“还存在足够4个元素”的位置是:[4 - (4 - 2)] = 2 。但是由于要选取的是闭集合,也就是最后存在的数也是要被选进去的,所以索引还要+1,也就是代表最末尾从3号位置开始填入,才能满足达到满4个元素的组合。所以4不考虑,直接pass。
for (int i = start; i <= n - (k - path.size()) + 1; i++)
最后的剪枝操作完成后就是这样。