当前位置: 首页 > article >正文

leetcode 46 全排列 | 回溯

在这里插入图片描述

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        def backtrace(nums,track,used):
            # 触发结束的条件
            if len(track) == len(nums):
                res.append(track.copy()) # 
                return
            for i in range(len(nums)):
                if used[i] :
                    continue
                # 做选择
                track.append(nums[i])
                used[i] = True
                # 进入下一层
                backtrace(nums,track,used)
                # 取消选择
                track.pop()
                used[i] = False
        res = []
        used = [False] * len(nums)
        track = []
        backtrace(nums,track,used)
        return res

解释

permute 是主方法,用于初始化回溯过程并返回结果。

  • 初始化 res 为空列表,用于存储所有排列。
  • 初始化 used 为布尔值列表,表示每个元素是否被使用。
  • 初始化 track 为空列表,用于存储当前路径。
  • 调用 backtrace 开始回溯过程。
  • 返回结果列表 res
backtrace 函数

backtrace 是一个递归函数,用于生成所有排列。

  • 结束条件

    • track 的长度等于 nums 的长度时,说明已经生成了一个完整的排列,将其添加到结果列表 res 中。
  • 回溯过程

    • 遍历 nums 中的每个元素。
    • 如果当前元素已经被使用(used[i]True),则跳过。
    • 将当前元素添加到 track 中,并标记为已使用(used[i] = True)。
    • 递归调用 backtrace
    • 回溯:移除 track 中的最后一个元素,并将当前元素标记为未使用(used[i] = False)。

track.copy() 的重要性

  • 在将 track 添加到结果列表 res 时,需要使用 track.copy(),否则 res 中存储的将是同一个 track 的引用。在后续的回溯过程中,track 会被修改,导致 res 中的内容也发生变化。

http://www.kler.cn/a/611431.html

相关文章:

  • 重学vue3(三):vue3基本语法及使用
  • 【测试开发】OKR 小程序端黑盒测试报告
  • leetcode.189.轮转数组
  • ZBlog泛目录程序插件实现零编程基础实现自动化内容生成
  • 一、MySQL8的my.ini文件
  • 【Python】pillow库学习笔记4-利用ImageDraw和ImageFont在图像上添加文字
  • sqlite3数据库(文件)损坏恢复方法
  • 【论文分析】无人机轨迹规划,Fast-Planner:实时避障+全局最优的路径引导优化算法
  • 护网(蓝中)DNS面试题
  • 【蓝桥杯】真题 路径(数论+dp)
  • MATLAB 编写的函数或算法生成可供 C++ 调用的库或组件
  • 热门面试题第12天|Leetcode 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度 (内含热门面试题)
  • 基于硅基流动平台API构建定制化AI服务的实践指南
  • 若依框架二次开发——若依集成 JSEncrypt 实现密码加密传输方式
  • Linux程序性能分析
  • CSS3学习教程,从入门到精通,CSS3 图像属性知识点及案例代码(16)
  • 自动化测试selenium(Java版)
  • 深度学习 Note.1
  • 使用Debezium采集Postgresql数据
  • Ubuntu 更换阿里云镜像源图文详细教程