一、题目描述:
n 位格雷码序列是一个由 2的n的方次 个整数组成的序列,其中:
- 相邻的两个数的二进制表示只有一位不同
- 首尾两个数的二进制表示只有一位不同
二、示例:
三、思路:
对称生成法:
- 对n位格雷码,我们将其中每个数加上2的n次方,每个数加上2的n次方得到的序列也符合格雷序列的要求(相邻两个数二进制只有一位不同,首位只有一位不同)。
- 将这个序列倒叙加入n位格雷码后,就能得到(n+1)位格雷码 —— 0 ~ 2的(n+1)次方-1
四、图解:
五、代码:
class Solution {
public List<Integer> grayCode(int n) {
List<Integer> list = new ArrayList<>();
list.add(0); // 第一位为0
list.add(1); // 第二位为1
int start = 2;
while(start <= n){
// 将倒置后结果加入序列中,得到(start+1)位格雷码
for(int i=list.size()-1; i>=0; i--){
list.add(list.get(i) + (int)Math.pow(2, start-1));
}
start++;
}
return list;
}
}