您的位置:首页 > 其它

[leetcode刷题系列]Gray Code

2013-08-05 21:05 447 查看
前两天刚看了组合数学求关于求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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: