46. 全排列

76 阅读1分钟

46. 全排列

注意:

1 golang中函数是一等公民,写回溯的写法比c++简单

2 回溯返回的地方,需要tmp重新生成一份,不重新生成的话会在后面的操作修改这个值。(和扩容有关)

func permute(nums []int) [][]int {
	ans := make([][]int, 0)
	visit := make(map[int]int)
	length := len(nums)
	tmp := make([]int, 0)
	var trackBack func(tmp []int)
	trackBack = func(tmp []int) {
		if len(tmp) == length {
			ans = append(ans, append([]int(nil), tmp...)) // 注意2
			return
		}
		for _, v := range nums {
			if _, ok := visit[v]; ok {
				continue
			}
			tmp = append(tmp, v)
			visit[v] = 1
			trackBack(tmp)
			tmp = tmp[0 : len(tmp)-1]
			delete(visit, v)
		}
	}
	trackBack(tmp)
	return ans
}