囧, 这题卡了好久。 原因是vector<int> 参数忘了加引用了。
要时刻记得stl容器类型是值传递!!!!!, 平时写java写久了, 都搞混了。 当然其实java也是值传递。不过对于对象
而言, 传递的引用的地址。 这里面的具体区别可以Google一下。
然后具体算法依旧是组合数学上提供的方法。 伟大的组合数学, 继续看:)
class Solution {
bool next_comb(vector<int> & v, int n, int k){
bool is[n + 1];
memset(is, 0x00, sizeof(is));
for(int i = k - 1; i >= 0; -- i){
if(v[i] + 1 <= n && !is[v[i] + 1]){
int now = v[i] + 1;
for(int j = i; j < k; ++ j)
v[j] = now ++;
return true;
}else
is[v[i]] = true;
}
return false;
}
public:
vector<vector<int> > combine(int n, int k) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<int> > vv;
vector<int> now;
for(int i = 1; i <= k; ++ i)
now.push_back(i);
if(k <= 0){
vv.push_back(now);
return vv;
}
do{
vv.push_back(now);
}while(next_comb(now, n, k));
return vv;
}
};