链接
题目.
难度:
middle
解答:
最重要的是想到分成子问题,由n-1的结果推导n的结果,结社n-1的a1…an-1是有序的,那么n的解决方案就是a1…an-1 + 1an-1…1a1
package main
import "fmt"
func grayCode(n int) []int {
if n == 0 {
return []int{0}
}
result := make([]int, 1<<uint(n))
sub := grayCode(n - 1)
leftPart := result[:1<<uint(n-1)]
rightPart := result[1<<uint(n-1):]
copy(leftPart, sub)
for i, j := 0, len(sub)-1; i < len(sub); i, j = i+1, j-1 {
rightPart[j] = sub[i] | 1<<uint(n-1)
}
return result
}
func main() {
fmt.Println(grayCode(2))
}
复杂度分析
time
O(n**2)
space
O(n)
执行结果
执行用时 :
0 ms
, 在所有 Go 提交中击败了
100.00%
的用户
内存消耗 :
2.1 MB
, 在所有 Go 提交中击败了
75.51%
的用户