【Leetcode】89. Gray Code
程序员文章站
2022-05-23 21:47:12
...
题目地址:
https://leetcode.com/problems/gray-code/
生成位的格雷码。位格雷码是个int的数组,其每相邻的两个数的二进制表示只有一位不同,并且首尾也满足这个条件。
主要思路是这样:如果我们已经得到了位格雷码,那么位格雷码可以这样生成:先将得到的位格雷码反序,然后每个数字都加上即可。这有点像逆序的层序遍历二叉树。代码如下:
import java.util.ArrayList;
import java.util.List;
public class Solution {
public List<Integer> grayCode(int n) {
List<Integer> res = new ArrayList<>();
res.add(0);
for (int i = 0; i < n; i++) {
int size = res.size();
for (int j = size - 1; j >= 0; j--) {
res.add(res.get(j) + (1 << i));
}
}
return res;
}
}
时间复杂度。
算法正确性证明。当时显然成立。假设当时,上述算法可以正确地产生格雷码。那么对于这个格雷码,最先加到末尾的数是,这个数与只有最高位不同,所以至少当前这一步是可行的。接下来由归纳假设,后面加的数字与前一位也只有一位不同,这样一直加到了末尾。很显然与也只有最高位不同。所以这样生成的新的序列仍然是格雷码。由数学归纳法,算法正确。
上一篇: Spring依赖注入-装配
下一篇: DI依赖注入_手动装配_非注解