首页 > 代码库 > Leetcode-Gray Code

Leetcode-Gray Code

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 - 001 - 111 - 310 - 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 }

 

Leetcode-Gray Code