回溯算法解leetcode全排列问题

题目

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:

输入: [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有所心得,是时候总结分类啦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值