1. 程式人生 > 其它 >Leetcode 46. 全排列

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