leetcode做题笔记89. 格雷编码

n 位格雷码序列 是一个由 2n 个整数组成的序列,其中:

  • 每个整数都在范围 [0, 2n - 1] 内(含 0 和 2n - 1
  • 第一个整数是 0
  • 一个整数在序列中出现 不超过一次
  • 每对 相邻 整数的二进制表示 恰好一位不同 ,且
  • 第一个 和 最后一个 整数的二进制表示 恰好一位不同

给你一个整数 n ,返回任一有效的 n 位格雷码序列 。

思路一:找规律

int* grayCode(int n, int* returnSize) {
    int *ret = (int *)malloc((1 << n) * sizeof(int));
    ret[0] = 0;
    int ret_size = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = ret_size - 1; j >= 0; j--) {
            ret[2 * ret_size - 1 - j] = ret[j] | (1 << (i - 1));
        }
        ret_size <<= 1;
    }
    *returnSize = ret_size;
    return ret;
}

分析:

可将格雷码先列举几个找规律,当n=1时格雷码为0,1,n=2时格雷码为0,1,3,2,可以向后递推,发现前面的格雷码的顺序可以不变,直接考虑下一位的格雷码即可,同时发现每当n增加一,即二进制数多一位,原来的顺序向后递推一位,根据该规律编写相应代码解决

思路二:公式

int* grayCode(int n, int* returnSize) {
    int ret_size = 1 << n;
    int *ret = (int *)malloc(ret_size * sizeof(int));
    for (int i = 0; i < ret_size; i++) {
        ret[i] = (i >> 1) ^ i;
    }
    *returnSize = ret_size;
    return ret;
}

分析:

格雷码也可以使用公式直接求出。第 i (i≥0)i~(i \geq 0)i (i≥0) 个格雷码即为:gi=i⊕⌊i/2⌋编写相应代码,用异或解决问题

总结:

本题考察对新定义的数字找规律的能力,将答案列举出来再归纳总结即可解决

你可能感兴趣的:(leetcode,笔记,算法)