LeetCode89:Gray Code
2016-04-10 19:16
369 查看
The gray code is a binary numeral system where two successive values differ in only one bit.
Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.
For example, given n = 2, return [0,1,3,2]. Its gray code sequence is:
00 - 0
01 - 1
11 - 3
10 - 2
Note:
For a given n, a gray code sequence is not uniquely defined.
For example, [0,2,3,1] is also a valid gray code sequence according to the above definition.
For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.
对于n=2,它的结果包含n=1时的结果左边补零,以及逆序遍历n=1时的结果左边补1。
规律例如以下图,列出了n=1,n=2,n=3时的情况。
依据这个规律假设已知n=k的情况,那么n=k+1的结果包含对n=k的结果左边补零,即保存不变。然后逆序遍历n=k的结果左边补1就可以。
runtime:4ms
格雷码能够由相应的十进制数求出:grayCode=i^i>>1
runtime:4ms
Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.
For example, given n = 2, return [0,1,3,2]. Its gray code sequence is:
00 - 0
01 - 1
11 - 3
10 - 2
Note:
For a given n, a gray code sequence is not uniquely defined.
For example, [0,2,3,1] is also a valid gray code sequence according to the above definition.
For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.
解法一
这道题感觉是一个找规律的题目,找到规律后就非常好求解,感觉不是一道回溯的题。对于n=2,它的结果包含n=1时的结果左边补零,以及逆序遍历n=1时的结果左边补1。
规律例如以下图,列出了n=1,n=2,n=3时的情况。
依据这个规律假设已知n=k的情况,那么n=k+1的结果包含对n=k的结果左边补零,即保存不变。然后逆序遍历n=k的结果左边补1就可以。
runtime:4ms
class Solution { public: vector<int> grayCode(int n) { vector<int> result(1); for(int i=0;i<n;i++) { for(int j=result.size()-1;j>=0;j--) { result.push_back((1<<i)+result[j]); } } return result; } }。
解法二
解法二就涉及到gray code的数学知识了。要是知道这个数学知识。能够在几分钟之内就解出这道题。格雷码能够由相应的十进制数求出:grayCode=i^i>>1
runtime:4ms
class Solution { public: vector<int> grayCode(int n) { vector<int> result; for(int i=0;i<1<<n;i++) { result.push_back(i^i>>1); } return result; } };
相关文章推荐
- 在Linux中布Java项目的开发环境
- char* s="AAA"; printf("%s",s); s[0]='B'; printf("%s",s); 有什么错?如何改
- C++ Map(list与数组的结合int型)(hash算法.)
- RandomAccessFile关于多线程的一些知识
- ubuntu 15.10 安装matlab2014b
- android Studio 设置快捷键Alt+/联想,跟eclipse一样
- [Lintcode] Search Insert Position
- white-space:nowrap 的妙用
- 数据库设计
- python全局变量的使用错误
- 版本号的比较
- 大数加法1.1
- android 常见的一些异常和错误
- GCC & ELF文件格式 &linux内核如何加载和启动一个可执行程序
- 你再也不用狂淘宝,逛商场了,在家直接随心所欲打印衣服吧
- 欢迎使用CSDN-markdown编辑器
- 4网页版四则运算
- 计算器第四次作业
- 【EJB系列】(一)——JBOSS7中开发一个简单的EJB应用
- uva 1583 Digit Generator