89.格雷编码

49 阅读1分钟

题目:
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)