[leetcode刷题系列]Gray Code

来源:互联网 发布:java工作流视频教程 编辑:程序博客网 时间:2024/06/12 21:33

前两天刚看了组合数学求关于求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;    }};


原创粉丝点击