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;
    }
};
相关推荐
hetao17338378 小时前
2026-01-06 hetao1733837 的刷题笔记
c++·笔记·算法
a努力。8 小时前
国家电网Java面试被问:最小生成树的Kruskal和Prim算法
java·后端·算法·postgresql·面试·linq
Geminit9 小时前
无人机培训,蚂蚁智飞在线训练,AI赋能新培训/学习模式
职场和发展
洛生&9 小时前
Counting Towers
算法
Evand J9 小时前
【MATLAB例程,附代码下载链接】基于累积概率的三维轨迹,概率计算与定位,由轨迹匹配和滤波带来高精度位置,带测试结果演示
开发语言·算法·matlab·csdn·轨迹匹配·候选轨迹·完整代码
X在敲AI代码9 小时前
LeetCode 基础刷题D2
算法·leetcode·职场和发展
源代码•宸9 小时前
Leetcode—1929. 数组串联&&Q1. 数组串联【简单】
经验分享·后端·算法·leetcode·go
数据大魔方9 小时前
【期货量化实战】跨期套利策略:价差交易完整指南(TqSdk源码详解)
数据库·python·算法·github·程序员创富
weixin_461769409 小时前
15. 三数之和
c++·算法·leetcode·三数之和
NAGNIP9 小时前
一文搞懂机器学习中的学习理论!
算法·面试