[LeetCode#89]Gray Code

The problem:

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.

My analysis:

The solution behind is problem is very tricky, but elegant. 

The wiki link for the solution:

http://zh.wikipedia.org/wiki/格雷码#mediaviewer/File:Binary-reflected_Gray_code_construction.svg

The key idea: 

n's Gray code collection could be infered from n-1's gray code by following way:

1. first, we add '0' at the front of all gray code of n-1.

Since the '0' would not change the value of the gray code, we could just keep the n-1's gray integer.



2. Second, we reverse the n-1's gray code collection, and add '1' at the front of all gray code of n-1.

The method is very tricky, since the reverse can guarantee the two middle elements have the same gray code series.

00                      000

01                      001

10                      010

11 <--- the same        011 <--- prefix: 0

11 <--- the same        111 <--- prefix: 1

10                      110

01                      101

00                      100

What a tricky method!!!

The code for this is :

for (int i = 2; i <= n; i++) {

    for (int j = ret.size() - 1; j >= 0; j--) {

        ret.add(ret.get(j) + (1 << i - 1));

    }

}

Facts:

1. we won't delete the n-1's gray Iteger.

2. we scan the ArrayList from the end to the start.



A little skill:

How to get the interger value of n digits, and only the nth digit's value is 1, other's are 0.

9 digits: 100000000   1 << 8

n digits: 1 << n - 1 (This is a very important skill!!!not 1 << n).

My solution:

public class Solution {

    public List<Integer> grayCode(int n) {

        ArrayList<Integer> ret = new ArrayList<Integer> ();

        if (n < 0 || n > 32)

            return ret;

        if (n == 0) {

            ret.add(0);

            return ret;

        }

        ret.add(0);

        ret.add(1);

        for (int i = 2; i <= n; i++) {

            for (int j = ret.size() - 1; j >= 0; j--) {

                ret.add(ret.get(j) + (1 << i - 1));

            }

        }

        return ret;

    }

}

 

你可能感兴趣的:(LeetCode)