全排列
题目:
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [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 技术无止境,追求更高。