- 题目:在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码。给定一个数字n,求n位的格雷码对应的十进制数组成的列表
- 难度:Medium
思路:
先举几个例子找出格雷码的规律
当n=1时,只有两种情况0或者1
当n=2时,有00,01;11,10
当n=3时,有000,001,011,010;100,101,111,110
当n=4时,有0000,0001,0011,0010,0100,0101,0111,0110;1000,1001,1011,1010,1100,1101,1111,1110
通过几个例子之后,发现n位的格雷码是在n-1位的格雷码的基础上在高位加1,或者加0(高位加0相当于对n-1位的格雷码没有改变)
将基值设为0,第i次迭代是将当前列表里的第i-1次迭代之后的列表里的值都加上2的i次幂,然后加入列表- 代码:
public class Solution {
public List<Integer> grayCode(int n) {
List<Integer> result = new ArrayList<>();
int base = 0;
result.add(base);
//backtrack(n,0,base,result);
for(int i = 0; i < n; i++){
int size = result.size();
for(int j=size-1; j >= 0; j--){
result.add(result.get(j) + (1<<i));
}
}
return result;
}
}