leetcode每日一题34

89.格雷编码

观察一下n不同时的格雷编码有什么特点

n=1 [0,1]

n=2 [0,1,3,2]

n=3 [0,1,3,2,6,7,5,4]

......

可以看到n=k时,编码数量是n=k-1的数量的一倍

同时n=k编码的前半部分和n=k-1一模一样

n=k编码的最后一位是2k-1

后半部分的编码是其对应的前半部分的对称的位置的数字+2k-1
如图可以看出原理,为了增加长度后,使得隔着中轴线相邻的第2k-1位和第2k-1+1位差一位,那么就要在新增加的位上由0变1(因为前半部分出现过在原有的位上是1的编码了)

也就是数字上增加了2k-1

至于其他的位,因为按照前面的编码放置1的顺序是唯一的,所以只要在最高位都填1,然后对称着顺序来就好了

因此代码为

cpp 复制代码
class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> gray;
        gray.push_back(0);
        gray.push_back(1);
        if(n==1)
            return gray;
        for(int i=2;i<=n;i++)
        {
            for(int j=pow(2,i-1)-1;j>=0;j--)
            {
                gray.push_back(gray[j]+pow(2,i-1));
            }
        }
        return gray;
    }
};

格雷编码有相当多的生成方法

还有一种,比如说G(i)=(i ^ (i >> 1))也就是G(i)=i^(i/2)
从这个图可以看出,如果二进制码字的第 i 位和 i+1 位(从右边开始数)相同,则对应的格雷码的第i位为0,否则为1(当i+1=n时,二进制码字的第n位被认为是0,即第n-1位不变)

cpp 复制代码
class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> gray;
        for(int i=0;i<pow(2,n);i++)
            gray.push_back(i^i>>1);
        return gray;
    }
};
相关推荐
月明长歌20 小时前
【码道初阶】牛客TSINGK110:二叉树遍历(较难)如何根据“扩展先序遍历”构建二叉树?
java·数据结构·算法
jqrbcts20 小时前
关于发那科机器人视觉补偿报警设置
人工智能·算法
_Li.20 小时前
机器学习-线性判别函数
人工智能·算法·机器学习
蒲小英20 小时前
算法-栈与队列
算法
代码游侠20 小时前
学习笔记——IPC(进程间通信)
linux·运维·网络·笔记·学习·算法
Nick_zcy20 小时前
基于Vue和Python的羽毛球拍智能推荐系统, 从“不会选羽毛球拍”到“选对拍”的一站式小工具
前端·vue.js·python·算法·推荐算法
风筝在晴天搁浅21 小时前
hot100 438.找到字符串中所有字母异位词
算法
zmzb010321 小时前
C++课后习题训练记录Day53
数据结构·c++·算法
老黄编程21 小时前
视觉SLAM十四讲解读-(v2.p84)李代数求导
算法·slam·李群李代数·视觉slam十四讲
LYFlied21 小时前
【每日算法】131. 分割回文串
前端·数据结构·算法·leetcode·面试·职场和发展