题目链接:https://leetcode.com/problems/gray-code/
格雷码生成的思路可以参考这一篇(https://blog.csdn.net/To_be_to_thought/article/details/79903645)
思路一:先用“0”和“1”生成所有格雷码,再把二进制字符串表达水文格雷码转成十进制数字。
代码如下:
class Solution {
public List<Integer> grayCode(int n) {
if(n==0)
{
LinkedList<Integer> ret=new LinkedList<Integer>();
ret.add(0);
return ret;
}
LinkedList<String> list=new LinkedList<>();
list.add("0");list.add("1");
for(int i=2;i<n+1;i++)
{
LinkedList<String> new_list=new LinkedList<>();
for(String each:list)
{
int index=(new_list.size()+1)/2;
new_list.add(index,'0'+each);
index=(new_list.size()+1)/2;
new_list.add(index,'1'+each);
}
list=new_list;
}
LinkedList<Integer> ret=new LinkedList<Integer>();
for(String str:list)
ret.add(StringtoInteger(str));
return ret;
}
public static int StringtoInteger(String str)
{
int sum=0,multiply=1;
for(int i=str.length()-1;i>=0;i--)
{
sum += (str.charAt(i)-'0')*multiply;
multiply*=2;
}
return sum;
}
}
看这个代码的过程就知道效率很渣,时间复杂度为O(2^n)
思路二:直接基于数字运算生成,需要推导一下格雷码表达的十进制数的递推公式
class Solution {
public List<Integer> grayCode(int n) {
List<Integer> result = new ArrayList<>();
result.add(0);
if (n == 0) return result;
result.add(1);
int coef = 2;
for (int i = 1; i < n; i++, coef *= 2)
for (int j = coef - 1; j >= 0; j--)
result.add(result.get(j) + coef);
return result;
}
}