跳到主要内容

89.格雷编码

链接:89.格雷编码
难度:Medium
标签:位运算、数学、回溯
简介:给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。

题解 1 - typescript

  • 编辑时间:2021-11-07
  • 执行用时:140ms
  • 内存消耗:54.1MB
  • 编程语言:typescript
  • 解法介绍:dfs。
function grayCode(n: number): number[] {
if (n === 0) return [0];
const set = new Set<number>([0]);
const ans: number[] = [0];
dfs();
return ans;
function dfs(num = 0): boolean {
if (set.size === 2 ** n) {
return true;
}
for (let i = 0; i <= n; i++) {
const bit = 1 << i;
const nextNum = num & bit ? num & ~bit : num | bit;
if (set.has(nextNum)) continue;
set.add(nextNum);
ans.push(nextNum);
if (dfs(nextNum)) return true;
ans.pop();
set.delete(nextNum);
}
return false;
}
}

题解 2 - typescript

  • 编辑时间:2021-11-07
  • 执行用时:108ms
  • 内存消耗:50.3MB
  • 编程语言:typescript
  • 解法介绍:后半部分逆序输出。
function grayCode(n: number): number[] {
const ans = [0];
if (n === 0) return ans;
while (n--) {
ans.push(
...Array.from(ans)
.reverse()
.map(v => v | (1 << n))
);
}
return ans;
}

题解 3 - cpp

  • 编辑时间:2022-01-08
  • 执行用时:8ms
  • 内存消耗:11.5MB
  • 编程语言:cpp
  • 解法介绍:每次反向覆盖。
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> ans(2, 0);
ans[1] = 1;
for (int i = 1; i < n; i++) {
for (int j = ans.size() - 1; j >= 0; j--) {
ans.push_back(ans[j] | 1 << i);
}
}
return ans;
}
};