遇到一道算法题的解法,比较难理解,这里记录一下
算法原题是给定正整数n和k,返回 1 … n 中所有可能的 k 个数的组合。
这道题可以采用回溯法来解决,但是这里我们看下第二种方法:字典序 (二进制排序) 组合,我们可以将这个组合看做一个二进制的排序,如下图,只要我们将k位的二进制排序完成,就能得到所有的组合。
这里的排序算法,有点难以理解,仔细研究,会发现很巧妙。
class Solution{
public:
vector<vector<int>> combine(int n,int k){
vector<vector<int>> res;
vector<int> temp;
for(int i=1;i<=k;i++){
temp.push_back(i);
}
temp.push_back(n+1);
int j = 0;
while (j<k) {
res.push_back(vector<int> (temp.begin(),temp.begin()+k));
//后面的循环部分每次生成一个序列,并按二进制递增
j = 0;
while (j<k&&(temp[j+1]==temp[j]+1)) {
temp[j] = j + 1;
j++;
}
temp[j] = temp[j]+1;
}
return res;
}
};