原标题链接: http://oj.leetcode.com/problems/gray-code/ 

这道题要求求出n位的格雷码相应的二进制数,主要在于找到一种格雷码的递增方法(格雷码并非唯一的,能够有多种)。

我们来看看有了n-1位的格雷码怎样得到n位的格雷码呢?事实上方法比較简单。首先在n-1位的格雷码前面都加入0作为前2^(n-1)个格雷码,它们一定是合法的由于除了第一位(都是0)其余位都跟n-1的格雷码一致,所以两两之间仅仅相差一位。满足要求。

接下来看看怎样接上剩下的2^(n-1)个。我们把n-1位的格雷码倒序排列。然后在每一个前面加入1。然后接到上述的前2^(n-1)个就能够了。首先由于是倒序过来,所以中间两个元素除去第一位其它都是一样的(由于原来最后一个,如今倒序过来就是第一个),而他们第一位各自是0和1,满足格雷码的要求。而剩下的元素由于我们是n-1位的格雷码倒序排列,所以两两都是满足要求的,加上前面都一样的位1。仍然满足条件。最后看看这些数字是不是都不一样。前半部分和后半部分肯定不会一样,而由于前半部分都是0开头,后半部分都是1打头,所以互相之间也不会有反复,能够看出覆盖了全部数字,并且依次下来均满足条件。

如此我们提出了格雷码的递推方法,我们仅仅须要做一次位数的循环,每次依据上面结果构造当前位数的结果就可以。算法复杂度是O(2+2^2+...+2^n-1)=O(2^n)。所以是指数量级的,由于是结果数量无法避免。

空间复杂度则是结果的大小,也是O(2^n)。

代码例如以下:

public ArrayList<Integer> grayCode(int n) {
ArrayList<Integer> res = new ArrayList<Integer>();
if(n<0)
return res;
if(n==0)
{
res.add(0);
return res;
}
res.add(0);
res.add(1);
for(int i=2;i<=n;i++)
{
int size = res.size();
for(int j=size-1;j>=0;j--)
{
res.add(res.get(j)+(1<<(i-1)));
}
}
return res;
}

能够看出上面代码并不须要处理前半部分,由于要求的是二进制数相应的整数,所以在前面加0等于原来的数字,所曾经面数字仅仅须要保持原来就可以,后面进行倒序然后对最高位赋1就可以。感觉更接近于一道寻找规律的题目。实现上用到一点位运算会比較简单,只是位运算是这道间的分题研究,关于位运算的访谈或专题,需要熟悉哈萨克斯坦。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

Gray Code -- LeetCode的更多相关文章

  1. Gray Code leetcode java

    题目: The gray code is a binary numeral system where two successive values differ in only one bit. Giv ...

  2. 89. Gray Code - LeetCode

    Question 89. Gray Code Solution 思路: n = 0 0 n = 1 0 1 n = 2 00 01 10 11 n = 3 000 001 010 011 100 10 ...

  3. [LeetCode] Gray Code 格雷码

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  4. [LeetCode]题解(python):089 Gray Code

    题目来源 https://leetcode.com/problems/gray-code/ The gray code is a binary numeral system where two suc ...

  5. 【一天一道LeetCode】#89. Gray Code

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 The gra ...

  6. [leetcode]Gray Code @ Python

    原题地址:https://oj.leetcode.com/problems/gray-code/ 题意: The gray code is a binary numeral system where ...

  7. 【Leetcode】【Medium】Gray Code

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  8. [LeetCode] 89. Gray Code 格雷码

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  9. 【LeetCode】89. Gray Code 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

随机推荐

  1. 全然符合package.json在CommonJS中的规范

    众所周知,package.json是CommonJS规定的用来描写叙述包的文件,全然符合规范的package.json文件应该含有一下字段. name:包的名称,必须是唯一的.由小写英文字母.数字和下 ...

  2. 自动更改IP地址反爬虫封锁,支持多线程(转)

    8年多爬虫经验的人告诉你,国内ADSL是王道,多申请些线路,分布在多个不同的电信机房,能跨省跨市更好,我这里写好的断线重拨组件,你可以直接使用. ADSL拨号上网使用动态IP地址,每一次拨号得到的IP ...

  3. POJ1470 Closest Common Ancestors 【Tarjan的LCA】

    非常裸的模版题,只是Tarjan要好好多拿出来玩味几次 非常有点巧妙呢,tarjan,大概就是当前结点和它儿子结点的羁绊 WA了俩小时,,,原因是,这个题是多数据的(还没告诉你T,用scanf!=EO ...

  4. Learning Cocos2d-x for WP8(4)——中文显示

    原文:Learning Cocos2d-x for WP8(4)--中文显示 C#(wp7)兄弟篇Learning Cocos2d-x for XNA(4)——中文显示 Cocos2d-x中文显示,似 ...

  5. 在项目里交叉使用Swift和OC

    Swift and Objective-C in the Same Project 在项目里交叉使用Swift和OC Swift与OC的兼容性使得你能够在项目里使用Swift+OC的方式编写应用程序, ...

  6. Thinkphp中field和getField

    在数据库查询操作中field和getField方法是使用最频繁的.可是两者是有一定差别的.在这里记录下. field方法是用于定义要查询的字段(支持字段排除). getField方法获取数据表中的某个 ...

  7. 图画(txt等一下)实施开放的默认下载的默认浏览器,而不是(Java文本)

    在网络上,假设我们超链接地址对应于jpg档,txt档,点击链接,默认浏览器打开这些文件,而不是下载,那么,你如何实现竞争力的默认下载. 1.可通过自己写一个download.jsp来实现 <%@ ...

  8. freemarker导出word带图片

    导出word带图片 如果你需要在word中添加图片,那你就在第一步制作模板时,加入一张图片占位,然后打开xml文档,可以看到如下的一片base64编码后的代码: <w:binData w:nam ...

  9. 浅谈TCP优化(转)

    很多人常常对TCP优化有一种雾里看花的感觉,实际上只要理解了TCP的运行方式就能掀开它的神秘面纱.Ilya Grigorik 在「High Performance Browser Networking ...

  10. UML相关工具一览

    http://www.cnblogs.com/chehaoj/p/3478003.html TopCoder UML Tool 1.2.6 TopCoder, Inc http://www.topco ...