result = [] def backtrack(路径, 选择列表): # 选择列表是由一系列参数组成的 if 满足结束条件: result.add(路径) # 路径就是要添加的结果 return for 选择 in 选择列表: / if 选择条件: 做选择 backtrack(路径, 选择列表) 撤销选择
从空字符串开始,上面的(绿色)分别加0、1,下面的(红色)分别加1、0,直到长度达n。
所以回溯的终止条件是 len(path) == n 选择列表通过一个 flag 变量判断当前到底是加 0 还是加 1。
Python版本
方法一根据格雷数镜面排列性质的实现
1 2 3 4 5 6 7 8 9
classSolution: defgrayCode(self, n: int) -> List[int]: res = [0] for i inrange(n): size = len(res) # 为啥要从后面往前循环,因为是镜像的,由0 1得到1 0,所以必须从后往前循环。 for j inrange(size-1, -1, -1): res.append(res[j] | (1 << i)) return res
时间复杂度:\(O(2^n)\)
方法二直接将二进制数字转成格雷码的实现
1 2 3 4 5 6
classSolution: defgrayCode(self, n: int) -> List[int]: res = [] for i inrange(2**n): res.append((i >> 1)^i) return res