博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode 89. 格雷编码
阅读量:5213 次
发布时间:2019-06-14

本文共 2176 字,大约阅读时间需要 7 分钟。

格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。

给定一个代表编码总位数的非负整数 n,打印格雷码序列。格雷码序列必须以 0 开头。

例如,给定 n = 2,返回 [0,1,3,2]。其格雷编码是:

00 - 001 - 111 - 310 - 2
1 #include
2 class Solution { 3 public: 4 void dfs(vector
& ans, int cur, int n){ 5 if(n == 0) {ans.push_back(0); return;}//只有一位格雷,特别处理 6 if(cur > n) return; 7 if(cur == 1){ 8 ans.push_back(0); 9 ans.push_back(1);10 dfs(ans, cur+1, n);11 }else{12 int len = ans.size();//循环前确定ans的长度,在循环中,ans的长度是变化的13 for(int j = 0; j < len; j++)14 ans.push_back(ans[len-j-1]); //把ans中的所有元素反向添加到ans后面15 for(int j = len; j < 2*len; j++)16 ans[j] = ans[j] + pow(2, cur-1); //在前面添加1, 相当于ans[j]+2^(cur-1);17 dfs(ans, cur+1, n);18 }19 }20 vector
grayCode(int n) {21 vector
ans;22 dfs(ans, 1, n);23 return ans;24 }25 };

n位的格雷码可以由n-1位的格雷码获得

一位格雷码:0,1

两位格雷码:00,01;11,10

三位格雷码:000,001,011,010;110,111,101,100

四位格雷码:0000,0001,0011,0010,0110,0111,0101,0100; 1100,1101,1111,1110,1010,1011,1001,1000

通过上面的枚举可以发现,格雷码的实现其实是一个递归过程

例如三位格雷码的前四位是把两位格雷码按从左到右的顺序在每一个格雷码前面加0实现的,后面四位是把两位格雷码按照从右到左的顺序在每一位格雷码前面加一实现的,大家按照这个方法推一下格雷码,应该能理解这段话的意思。

此外在前面加0,格雷码对应的值不会改变,前面加一会让各类码的值增加2^(n-1),n为格雷码的位数

 

对上面的程序做了一点小改进

1 #include
2 class Solution { 3 public: 4 void dfs(vector
& ans, int cur, int n){ 5 if(n == 0) {ans.push_back(0); return;}//只有一位格雷,特别处理 6 if(cur > n) return; 7 if(cur == 1){ 8 ans.push_back(0); 9 ans.push_back(1);10 dfs(ans, cur+1, n);11 }else{12 int len = ans.size();//循环前确定ans的长度,在循环中,ans的长度是变化的13 for(int j = 0; j < len; j++)14 ans.push_back(ans[len-j-1] + pow(2, cur-1)); 15 dfs(ans, cur+1, n);16 }17 }18 vector
grayCode(int n) {19 vector
ans;20 dfs(ans, 1, n);21 return ans;22 }23 };

 

转载于:https://www.cnblogs.com/mr-stn/p/8998221.html

你可能感兴趣的文章
HTML标签_1
查看>>
jsp组成元素
查看>>
排序算法(转)
查看>>
windows自带的可生成各种数据库连接字符串工具打开方法
查看>>
form表单中method的get和post区别
查看>>
【做题】arc068_f-Solitaire——糊结论
查看>>
Poj 1094 拓扑排序 水题
查看>>
Oracle SQL查询,日期过滤条件要注意的一点
查看>>
leetcode852 C++ 20ms 找最高峰 序列先增后减
查看>>
JavaScript深入系列(一)--原型和原型链详解
查看>>
一点感想
查看>>
产生随机数
查看>>
vm center(VC)5.1登陆密码忘记了怎么办?
查看>>
Python命名规范
查看>>
50款漂亮的国外婚礼邀请函设计(上篇)
查看>>
MD5加密简单算法
查看>>
安装Qcreator2.5 + Qt4.8.2 + MinGW_gcc_4.4 (win7环境)
查看>>
代码检查
查看>>
滚动条
查看>>
程序员的自我修养九Windows下的动态链接
查看>>