代码:将for循环中i的搜索范围进行缩小,免去多余的不可能符合条件的操作。
for(int i = start; i <= n-(k-tmp.size())+1;i++)
实质是剪枝,拿n=4,k=4作比较:
显然结果只可能是[1,2,3,4],选取顺序只可能是1-2-3-4,但是程序还是会以1后面也即2,3,4为开头暴力搜寻一遍。所以需要给搜寻规定范围来进行优化:
1.已经选择的元素个数:tmp.size();
2.为满足条件还需要:k - tmp.size()个元素;
3.所以至多从n - (k - tmp.size()) + 1 处开始遍历,再往后挪就不可能符合条件了。
比如n = 4, k = 3, tmp.size() = 1:
n - (k - tmp.size()) + 1 = 3,在for循环中(i = start; i <= n - (k - tmp.size()) + 1; i++),说明此时i至多从3开始搜,结果是[1,3,4],而不能从4开始搜,这样只能是[1,4](不符合条件)。
为什么要在n - (k - tmp.size()) 后面加1,举个例子,当n = k = 4,tmp.size() = 0时,此时n - (k - tmp.size()) = 0,但题目要求是[1,n]范围,所以必须从1开始,故+1。如果范围是[0,n]的话就直接n - (k - tmp.size())即可。