格雷编码

LeetCode算法网站算法题

https://leetcode-cn.com/problems/gray-code/

上来就瞎写!

class Solution 
{
public:
    vector<int> grayCode(int n) 
{
        if(n==0)
            return {0};
        int num=pow(2,n);
        vector<int>ans(num);
        for(int i=0;i<num;i++)
            ans[i]=i;
        return ans;
        
    }
};

很自然不对,注意题目中的格雷编码系统中连续的两个值只有一个数位不同,所以我这样就错了

所以看完评论区的一些理解之后,发现这道题目是找规律来求解。

class Solution
{
public:
    vector<int> grayCode(int n)
    {
        if(n==0)
            return {0};
        int num=pow(2,n);
        vector<int>ans(num,0);
        vector<int>t(num,0);
        for(int i=1; i<=n; i++)
        {
            int flag=0;
            int with=pow(2,i-1);
            for(int j=0; j<with; j++)
            {
                if(flag==0)
                {
                    ans[j*2]=t[j];
                    ans[j*2+1]=t[j]+with;
                }
                else
                {
                    ans[j*2]=t[j]+with;
                    ans[j*2+1]=t[j];
                }
                flag=(flag+1)%2;
            }
            t=ans;
        }
        return ans;

    }
};

思路:

既然每一个相邻位置的不同位只能有一个,举个例子那么当n==2的时候向n==3的时候转换的时候就可以把00看作000,然后最高位上变为1,发现数值大小增加了22次方,用同样的方式得到新增的序列100101111110,然后把000放第一个,再新老序列交替的把数字填入n==3的序列之中,类比举的例子,循环的把从0n的所有序列求解,这样就可以得到最后的解了。

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值