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.
For example, given n = 2, return [0,1,3,2]
. Its gray code sequence is:
00 - 0 01 - 1 11 - 3 10 - 2
Note:
For a given n, a gray code sequence is not uniquely defined.
For example, [0,2,3,1]
is also a valid gray code sequence according to the above definition.
For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.
Analysis:
For num = n, suppose we know a gray sequence for number n-1, we then can construct a sequence for n like this:
1. add 0 in front of the n-1 sequence.
2. add 1 in front of the reverse of the n-1 sequence.
Because the reverse of a valid gray sequence also satisfy the rule of the gray sequence, except that ends with 0. For example,
for num==2:
00,01,11,10
for num==3
000,001,011,010, 110,111,101,100.
Change the rule to integer number, then we have:
1. add n-1 sequence to the list.
2. reversely add (each int in n-1 sequence+base), where base==2^n.
Solution:
1 public class Solution { 2 public List<Integer> grayCode(int n) { 3 List<Integer> res = new ArrayList<Integer>(); 4 res.add(0); 5 if (n==0){ 6 return res; 7 } 8 res.add(1); 9 if (n==1) return res; 10 11 int base = 1; 12 for (int i=2;i<=n;i++){ 13 base = base*2; 14 List<Integer> newRes = new ArrayList<Integer>(); 15 newRes.addAll(res); 16 17 for (int j=res.size()-1;j>=0;j--){ 18 int temp = res.get(j)+base; 19 newRes.add(temp); 20 } 21 res = newRes; 22 } 23 return res; 24 25 } 26 }
NOTE: We actually does not need to create a new list for every n, since we only need to add the reverse n-1 sequence to the n-1 sequence to get n sequence.
1 public class Solution { 2 public List<Integer> grayCode(int n) { 3 List<Integer> res = new ArrayList<Integer>(); 4 res.add(0); 5 if (n==0){ 6 return res; 7 } 8 res.add(1); 9 if (n==1) return res; 10 11 int base = 1; 12 for (int i=2;i<=n;i++){ 13 base = base*2; 14 int end = res.size()-1; 15 for (int j=end;j>=0;j--){ 16 int temp = res.get(j)+base; 17 res.add(temp); 18 } 19 } 20 return res; 21 22 } 23 }