LeetCode46.全排列(Python实现)

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

输入: [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

经典回溯算法题目,代码及注释如下:

from typing import List


class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        # 定义结果集,临时数组,以及遍历范围
        result, tmp, end = [], [], len(nums)
        self._dfs(end, tmp, result, nums)
        return result

    def _dfs(self, end, tmp, result, input_nums):
        # 判断元素是否已经足够,若是,则添加进结果集,list是可变对象,需要拷贝一份副本再append
        if len(tmp) == len(input_nums):
            result.append(list(tmp))
            return

        for i in range(end):
            # 避免与自身重复
            if input_nums[i] in tmp:
                continue
            # 先将当前元素添加到临时数组中
            tmp.append(input_nums[i])
            # 已当前元素为根,向下递归
            self._dfs(end, tmp, result, input_nums)
            # 往后退一格,即回溯
            tmp.pop()

对于递归不是很熟练的同学,推荐使用pycharm的debug模式,打上断点,一步一步的观察递归栈中变量的变化情况,能提供很好的帮助~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值