89. Gray Code

2017-11-08  本文已影响0人  Nautilus1

题目描述:给非负整数 n 表示二进制位数,输出所有的 n 位格雷码,以0开始。

分析:时间复杂度O(2^n),空间O(1)。

代码:用格雷码的数学公式将0 ~ 2^n - 1的所有整数转化为格雷码。公式为:整数 n 的格雷码是 n xor (n / 2),即 n 与 n 的一半异或。异或位运算:

class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> ans;
        int sz = 1 << n;
        ans.reserve(sz);             //reserve函数用来给vector预分配存储区大小,但没有给这段内存进行初始化。即reserve 函数分配出来的内存空间,只是表示vector可以利用这部分内存,但vector不能有效地访问这些内存空间,访问的时候就会出现越界现象,导致程序崩溃。故不能用v[i]这种下标访问
        for (int i = 0; i < sz; i ++)
            ans.push_back( btog(i) );
        return ans;
    }
    int btog(int n)          //二进制数转化为格雷码
    {
        return n ^ (n >> 1);
    }
};
上一篇 下一篇

猜你喜欢

热点阅读