LeetCode89:Gray Code

The gray code is a binary numeral system where two successive values differ in only one bit.

Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.

For example, given n = 2, return [0,1,3,2]. Its gray code sequence is:

00 - 0
01 - 1
11 - 3
10 - 2
Note:
For a given n, a gray code sequence is not uniquely defined.

For example, [0,2,3,1] is also a valid gray code sequence according to the above definition.

For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.


解法一

这道题感觉是一个找规律的题目,找到规律后就很好求解,感觉不是一道回溯的题。
对于n=2,它的结果包括n=1时的结果左边补零,以及逆序遍历n=1时的结果左边补1,
规律如下图,列出了n=1,n=2,n=3时的情况。

这里写图片描述

根据这个规律如果已知n=k的情况,那么n=k+1的结果包括对n=k的结果左边补零,即保存不变,然后逆序遍历n=k的结果左边补1即可。
runtime:4ms

class Solution {
public:

    vector<int> grayCode(int n) {
        vector<int> result(1);
        for(int i=0;i<n;i++)
        {
                for(int j=result.size()-1;j>=0;j--)
                {
                   result.push_back((1<<i)+result[j]);
                }
        }
        return result;
    }
};

解法二

解法二就涉及到gray code的数学知识了,要是知道这个数学知识,可以在几分钟之内就解出这道题。
格雷码可以由对应的十进制数求出:grayCode=i^i>>1
runtime:4ms

class Solution {
public:
     vector<int> grayCode(int n) {
         vector<int> result;
         for(int i=0;i<1<<n;i++)
         {
             result.push_back(i^i>>1);
         }
         return result;
     }

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值