题目
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
回溯算法
result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择”
摘录来自: abuladong. “labuladong的算法小抄。” Apple Books.
append知识点
使用append时需要注意,slice是共享数据的。slice有个特性是允许多个slice指向同一个底层数组,这是一个有用的特性,在很多场景下都能通过这个特性实现 no copy 而提高效率。但共享同时意味着不安全。
因此,在回溯算法中使用append时为了防止覆盖,需要先copy一份数据,这样保证底层数组各不相同,互不影响,然后append
show me the code
var res [][]int
func permute(nums []int) [][]int {
res = [][]int{}
var track []int
backtrack(nums,track)
return res
}
func backtrack(nums, track []int) {
if len(track) == len(nums) {
var t = make([]int,len(track))
copy(t,track)
//append注意
res = append(res,t)
return
}
for i:=0; i<len(nums); i++ {
//排除不合法选择
if contain(track,nums[i]) {
continue
}
//做选择
track = append(track,nums[i])
//进入下一层决策树
backtrack(nums,track)
//取消选择
track = track[:len(track)-1]
}
}
func contain(track []int,item int) bool {
for _,v := range track {
if v==item {
return true
}
}
return false
}
总结
最近刷leetcode有所心得,是时候总结分类啦!