[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; } };
相关文章推荐
- LeetCode Best Time to Buy and Sell Stock 系列
- [Leetcode] Gray Code
- 【Leetcode】Single Number 系列问题
- Leetcode N-Queens系列
- LeetCode刷题系列(十三)SingleNumber && MajorityNumber
- Leetcode: 89. Gray Code
- Gray Code -- LeetCode
- LeetCode 笔记系列二 Container With Most Water
- [LeetCode]X Sum系列@python
- [LeetCode] 033: Gray Code
- 逆序输出字符串的单词——Leetcode系列(二)
- LeetCode 笔记系列12 Trapping Rain Water [复杂的代码是错误的代码]
- leetcode 系列
- [LeetCode] Gray Code
- 【LeetCode从零单刷】Gray Code
- Leetcode 89. Gray Code
- 每天一题LeetCode系列(有翻译,注释,持续更新~)
- Leetcode刷题系列(二)Binary Search
- leetcode - Gray Code
- 算法系列(16)Leetcode 387 First Unique Character in a String