Leetcode - Gray Code

My code:

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public List<Integer> grayCode(int n) {
        ArrayList<Integer> ret = new ArrayList<Integer>();
        if (n < 0)
            return null;
        else if (n == 0) {
            ret.add(0);
            return ret;
        }
        int[] seq = helper(n);
        for (int i = 0; i < seq.length; i++)
            ret.add(seq[i]);
        return ret;
    }
    
    private int[] helper(int n) {
        if (n == 1) {
            int[] ret = new int[2];
            ret[0] = 0;
            ret[1] = 1;
            return ret;
        }
        int[] tmp = helper(n - 1);
        int[] ret = new int[2 * tmp.length];
        int base = (int) Math.pow(2, n - 1);
        for (int i = 0; i < tmp.length; i++)
            ret[i] = tmp[i];
        for (int i = tmp.length; i < 2 * tmp.length; i++)
            ret[i] = base + tmp[2 * tmp.length - i - 1];
        return ret;
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        System.out.println(test.grayCode(3));
    }
}

终于自己做对一道medium题目了。。。
做完后看了下提示,和我的思路一样,是backtracing.我的理解就是DFS。
这是有规律的。
n = 1
0
1

n = 2
0 0
0 1
1 1
1 0

n = 3
0 0 0
0 0 1
0 1 1
0 1 0
1 1 0
1 1 1
1 0 1
1 0 0

可以看出来,n = 3 时, 先把 n = 2 的这块数组,加上0,作为n = 3时的上半部分。
然后将n = 2 这块数组reverse,然后加上 2 ^ (n – 1); 作为n = 3时的下半部分。
然后这条状态和上条状态之间的关系就很清楚了。就可以用DFS了。

**
总结: DFS
**

Anyway, Good luck, Richardo!

My code:

public class Solution {
    public List<Integer> grayCode(int n) {
        List<Integer> ret = new ArrayList<Integer>();
        if (n < 0) {
            return ret;
        }
        else if (n == 0){
            ret.add(0);
            return ret;
        }
        
        List<Integer> pre = grayCode(n - 1);
        int num = (1 << (n - 1));
        for (int i = pre.size() - 1; i >= 0; i--) {
            pre.add(pre.get(i) + num);
        }
        return pre;
    }
}

reference:
https://discuss.leetcode.com/topic/31329/java-easy-version-to-understand

自己没能想出来。发现这些解法都比以前自己的解法要简洁易懂直接高效。

这个的话有点类似于找规律。

n = 3
0 0 0 = 0
0 0 1 = 1
0 1 1 = 3
0 1 0 = 2
————————————
1 1 0 = 6
1 1 1 = 7
1 0 1 = 5
1 0 0 = 4

可以看到,下半部分,等于上半部分,从下往上开始,每个元素加上 4

Anyway, Good luck, Richardo! — 09/17/2016

    原文作者:Richardo92
    原文地址: https://www.jianshu.com/p/28eec210504d#comments
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞