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