Leetcode 46. 全排列

思路 回溯法

var res [][]int
func permute(nums []int) [][]int {
res = make([][]int, 0)
backTracking([]int{}, nums, len(nums))
return res
}
func backTracking(path []int, nums []int, numLength int) {
if len(nums) == 0 { //如果当前nums已经空了,已经到了叶子节点,可以收集结果了
temp := make([]int, len(path))
copy(temp, path)
res = append(res, temp) //将这个叶子节点的结果添加到最终结果数组中
}
for i := 0; i < numLength; i++ {
cur := nums[i] //临时存储当前值
path = append(path, cur) //现将当前值加到path中
nums = append(nums[:i], nums[i+1:]...) //因为当前值已经使用过,所以将这个值从nums中移除
backTracking(path, nums, len(nums)) //对剩下的值继续递归
nums = append(nums[:i], append([]int{cur}, nums[i:]...)...) //撤销将当前值从nums中移除的操作,将cur的值放回到原来i的位置
path = path[:len(path)-1] //撤销将当前值添加到path的操作
}
}

浙公网安备 33010602011771号