`

Leetcode - Gray Code

 
阅读更多
原题链接:https://leetcode.com/problems/gray-code/
[分析] 这题更像是找规律,n = 1时是 0, 1, n = 2时是00,01, 11, 10,后面两项可以看做是先对 0,1镜像得到1,0,然后分别加上10得到11,10, 因此可以从 i = 1时迭代求得 i = n的结果。Method2 是对 Method1的代码优化,空间使用率更高的同时时间效率也提升了(不需要每次都clone)。

public class Solution {
    // Method 2
    public List<Integer> grayCode(int n) {
        if (n < 0)
            return new ArrayList<Integer>();
        List<Integer> seed = new ArrayList<Integer>(1 << n);
        seed.add(0);
        if (n == 0)
            return seed;
        seed.add(1);
        int lastSize = 2;
        for (int i = 1; i < n; i++) {
            int largeHalfBase = 1 << i;
            for (int j = lastSize - 1; j >= 0; j--)
                seed.add(largeHalfBase + seed.get(j));
            lastSize = seed.size();
        }
        return seed;
    }
    // Method 1
    public List<Integer> grayCode1(int n) {
        if (n < 0)
            return new ArrayList<Integer>();
        List<Integer> seed = new ArrayList<Integer>(1 << n);
        seed.add(0);
        if (n == 0)
            return seed;
        seed.add(1);
        ArrayList<Integer> seed2 = new ArrayList<Integer>(1<<n);
        for (int i = 1; i < n; i++) {
            seed2.clear();
            seed2.addAll(seed);
            int largeHalfBase = 1 << i;
            for (int j = seed.size() - 1; j >= 0; j--)
                seed2.add(largeHalfBase + seed.get(j));
            seed = (ArrayList<Integer>) seed2.clone();
        }
        return seed;
    }
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics