【leetcode】89.(Medium)Gray Code
阿新 • • 發佈:2018-12-02
解題思路:中序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;
}
}
執行結果: