题目:
n 位格雷码序列 是一个由 2n 个整数组成的序列,其中:
- 每个整数都在范围
[0, 2n - 1]内(含0和2n - 1) - 第一个整数是
0 - 一个整数在序列中出现 不超过一次
- 每对 相邻 整数的二进制表示 恰好一位不同 ,且
- 第一个 和 最后一个 整数的二进制表示 恰好一位不同
给你一个整数 n ,返回任一有效的 n 位格雷码序列 。
算法:
方法一:暴力回溯,n大了会超时
func grayCode(n int) []int {
flag := make([]int, 1 << n)
result := make([]int, 1)
result[0] = 0
maxVal := 1 << n - 1
var backtracking func(index int) bool
backtracking = func(index int) bool{
if index > maxVal && isOneBitDifferent(result[0], result[len(result) - 1]){
return true
}
// 数字范围[1,2^n - 1]
for i := 1; i <= maxVal; i ++ {
if flag[i] != 1 && isOneBitDifferent(result[len(result) - 1], i) {
flag[i] = 1
result = append(result, i)
// fmt.Println(flag, maxVal, index, i, result)
success := backtracking(index + 1)
if success {
return true
}
result = result[:len(result) - 1]
flag[i] = 0
}
}
return false
}
backtracking(1)
return result
}
func isOneBitDifferent(a, b int) bool {
if a == b {
return false
}
t := a ^ b
for t > 0 {
if t % 2 == 0 {
t = t / 2
} else {
break
}
}
return t == 1
}
方法二:找规律
leetcode.cn/problems/gr…
ans[i] = i>>1 ^ i
fmt.Println(ans, i >> 1, i)