原题:The gray code is a binary numeral system where two successive values differ in only one bit.
Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.
输入n,求n位格雷码的十进制序列;
思路:
格雷码的递推公式:
n位格雷码前一半与n-1位格雷码相同,第n位添0;
后一半与n-1位格雷码镜像对称,第n位添1;
参考文章:
http://blog.csdn.net/sunnyyoona/article/details/18703803;
http://blog.csdn.net/u013564276/article/details/51362690
代码:
/*********************************
* 日期:2016-11-25
* 作者:Jassy
* 题号: LeetCode 89 (Gray Code)
* 来源:http://oj.leetcode.com/problems/gray-code/
* 结果:AC
* 来源:LeetCode
* 总结:
**********************************/
public class Solution {
public List<Integer> grayCode(int n) {
List<Integer> res=new ArrayList<Integer>();
if(n==0){
res.add(0);
return res;
}else if(n==1){
res.add(0);
res.add(1);
return res;
}
List<Integer> gray=grayCode(n-1);
for(int i=0;i<Math.pow(2,n);i++){
if(i<Math.pow(2,n-1)){
res.add(gray.get(i));
}else{
int tmp=gray.get((int)Math.pow(2,n)-i-1)+((int)Math.pow(2,n-1));
res.add(tmp);
}
}
return res;
}
}
有一个小问题,我还没能想明白,就是代码中每次递归都要进行(
2 ^ n)次
res.add()操作,共计(2 ^ n) + (2 ^ n-1) + ……次;
能否优化至只需最后res表中元素个数 2 ^ n 次res.add()操作?