1. 程式人生 > >【leetcode】89.(Medium)Gray Code

【leetcode】89.(Medium)Gray Code

解題思路:中序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; } }

執行結果:
在這裡插入圖片描述