46.M 全排列
Problem: 46. 全排列
思路
通过交换生成排列。
定义backtrack
函数,表示当前要排列start
位置:
如果
start
已经达到了数组的末尾,则把当前排列加到返回结果中。否则,从
[start, len(nums))
区间找一个数与start位置交换。只能从这个区间找是因为[0, start]
区间都是已经使用过的数字。
Code
func permute(nums []int) [][]int {
var ans [][]int
backtrack(nums, 0, &ans)
return ans
}
func backtrack(nums []int, start int, ans *[][]int) {
if start == len(nums)-1 {
*ans = append(*ans, append([]int{}, nums...))
return
}
// 从start开始,依次交换元素生成排列
for i := start; i < len(nums); i++ {
nums[i], nums[start] = nums[start], nums[i]
backtrack(nums, start+1, ans)
// 回溯,恢复原始顺序
nums[i], nums[start] = nums[start], nums[i]
}
}
Last updated
Was this helpful?