全排列
题目:
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
解题思路:
回溯算法实际上一个类似枚举的搜索尝试过程,
在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,
就“回溯”返回,尝试别的路径框架:
result = [] def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(路径, 选择列表) 撤销选择
代码:
/go
// 返回结果
var result [][]int
// 回溯核心
// nums: 原始列表
// pathNums: 路径上的数字
// used: 是否访问过
func backtrack(nums, pathNums []int, used[]bool) {
// 结束条件:走完了,也就是路径上的数字总数等于原始列表总数
if len(nums) == len(pathNums) {
tmp := make([]int, len(nums))
// 切片底层公用数据,所以要copy
copy(tmp, pathNums)
// 把本次结果追加到最终结果上
result = append(result, tmp)
return
}
// 开始遍历原始数组的每个数字
for i:=0; i<len(nums); i++ {
// 检查是否访问过
if !used[i] {
// 没有访问过就选择它,然后标记成已访问过的
used[i] = true
// 做选择:将这个数字加入到路径的尾部,这里用数组模拟链表
pathNums = append(pathNums, nums[i])
backtrack(nums,pathNums,used)
// 撤销刚才的选择,也就是恢复操作
pathNums = pathNums[:len(pathNums) -1]
// 标记成未使用
used[i] = false
}
}
}
func permute(nums []int) [][]int {
var pathNums []int
var used = make([]bool, len(nums))
// 清空全局数组(leetcode多次执行全局变量不会消失)
result = [][]int{}
backtrack(nums, pathNums, used)
return result
}
地址:https://mp.weixin.qq.com/s/DFZ59CfvWlxlxbuB7sgkRw
small_lei_it 技术无止境,追求更高。

浙公网安备 33010602011771号