解题思路:中序Morris遍历
我的想法是回溯,讨论区直接给出了格雷码关于i的表达式:gray[i]=i^(i/2)
即取i和i/2按位异或
提交代码:回溯
class Solution {
public List<Integer> grayCode(int n) {
List<Integer> ans=new ArrayList<Integer>();
//if(n==0) return ans;
int[] gray=new int[n];
for(int i=0;i<gray.length;i++)
gray[i]=0;
ans.add(0);
int tmp,p=-1,cnt=(int)Math.pow(2, n);
while(cnt>0) {
for(int i=0;i<n;i++) {
if(i==p) continue;
if(gray[i]==1) gray[i]=0;
else gray[i]=1;
tmp=turnGrayToNum(gray);
if(ans.contains(tmp)) {
if(gray[i]==0) gray[i]=1;
else gray[i]=0;
}else {
ans.add(tmp);
p=i;break;
}
}
cnt--;
}
return ans;
}
public int turnGrayToNum(int[] gray) {
int num=0;
for(int i=0;i<gray.length;i++) {
num+=gray[i]*Math.pow(2, i);
}
return num;
}
}
运行结果: