[leetcode刷题系列]Combinations

囧, 这题卡了好久。 原因是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;
    }
};


你可能感兴趣的:([leetcode刷题系列]Combinations)