[leetcode刷题系列]Gray Code

前两天刚看了组合数学求关于求combination的那节, 里面讲到了如何求Gray Code。 正好留意到题目标题有带Gray字眼的,就打开看了下。

关于详细算法过程的说明以及证明可以在组合数学中找到, 这里就不说了。


class Solution {
    int get_next(int now, int n){
        int num_bit = 0;
        int tmp = now;
        while(tmp > 0){
            num_bit ^= 1;
            tmp &= (tmp - 1);
        }
        if(num_bit & 1){
            for(int i = 0; i < n - 1; ++ i)
                if(now & (1 << i))
                    return now ^ (1 << i + 1);
            return 0;
        }else{
            return now ^ 1;
        }
    }
public:
    vector<int> grayCode(int n) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        vector<int> vc;
        if(n == 0){
            vc.push_back(0);
            return vc;
        }
        int now = 0;
        do{
            vc.push_back(now);
        }while((now = get_next(now, n)) != 0);
        return vc;
    }
};

===========我是分割线=================

下面的解法是在北美求职群看到的, 和上面得到的序列貌似是一样的。

关于这两种方法为什么是等价的问题上, 由于智力问题, 我无法得到一个很直观的解释。

不过倒是可以很容易证明为啥下面的方法的是正确的。这里就不说了,看到的同学可以自己想一下。


class Solution {
public:
    vector<int> grayCode(int n) {
        // Note: The Solution object is instantiated only once and is reused by each test case.
        vector<int> ret(1 << n);
        for(int i = 0; i < (1 << n); ++ i)
            ret[i] = i ^ (i >> 1);
        return ret;
    }
};


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