package algorithm.lc;
import java.util.ArrayList;
/**
* 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.
*
*/
// O(2^n) space, O(2^n) time
public class GrayCode {
public static class Solution {
// build list of n from list of n - 1
// 1. get the reverse of the list
// 2. add suffix 0 to original list, add suffix 1 to reversed list
// 3. concatenate two lists
public static ArrayList