Leetcode 46. 全排列

46. 全排列 - 力扣(LeetCode)

 

 

 

思路 回溯法

 

 

 

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的操作
	}
}

  

posted @ 2022-05-09 20:27  SoutherLea  阅读(21)  评论(0编辑  收藏  举报