原标题链接: 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. Phalcon之 表单(Forms)

    Phalcon中提供了 Phalcon\Forms组件以方便开发人员创建和维护应用中的表单. 以下的样例中展示了主要的用法: <?php use Phalcon\Forms\Form, Phal ...

  2. mongodb - 前端form表单数据传输,在保存和清除的数据格式的处理程序的 - 非递归

    //处理时间段,将ISODate("2014-10-09T18: 37: 50.0Z") 兑换 2014-10-09 18:37:50这样的格式 //截至处理6层树形结构数据,当多 ...

  3. SVN与TortoiseSVN实战:补丁详解(转)

    硬广:<SVN与TortoiseSVN实战>系列已经写了五篇,第二篇<SVN与TortoiseSVN实战:标签与分支>和第三篇<SVN与TortoiseSVN实战:Tor ...

  4. dell N5010

    Inspiron N5010Microsoft Windows 10 企业版 (64位) (英特尔)Intel(R) Core(TM) i3 CPU       M 370  @ 2.40GHz(24 ...

  5. surfaceflinger中各个layer的排序

    surfaceflinger的主要工作就是负责把上层传递下来的各个不同的layer进行composition. 这里,我们来讨论一下各个layer在surfaceflinger中的上下排序关系和相关的 ...

  6. ubuntu14.04中 gedit 凝视能显示中文,而source insight中显示为乱码的解决的方法

    1.乱码显示情况: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcjc3NjgzOTYy/font/5a6L5L2T/fontsize/400/fill/ ...

  7. 阅读zepto.js的core中的Core methods

    学习zepto.js,參考资料:http://www.zeptojs.cn/ 跟jQuery一样.其选择符号也是$; 首先接触的是 $.()  选择 $(selector, [context]) ⇒ ...

  8. D3js-堆栈图

    效果图: 源码: <%@ page language="java" import="java.util.*" pageEncoding="UTF ...

  9. ceSetThreadPriority设置线程优先级~!

    ceSetThreadPriority 一直採用SetThreadPriority,结果今天发帖询问线程时间问题,才突然顿悟...发现SetThreadPriority只设置248-255,也就是说就 ...

  10. UltraEdit-32 温馨提示:右协会,取消 bak文件

    1.最近安装UltraEdit-32 无权协会,能够 高级 ->组态 ->文件关联 在 检查 继承到资源管理器 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...