【leetcode100】全排列

embedded/2025/3/4 13:59:20/

1、题目描述

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

2、先验知识

2.1 回溯算法

回溯法也可以叫做回溯搜索法,它是⼀种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。虽然回溯法很难,很不好理解,但是回溯法并不是什么⾼效的算法。因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法⾼效⼀些,可以加⼀些剪枝的操作,但也改不了回溯法就是穷举的本质。

但是面对一些问题,能用穷举法求解已经是最优算法,比如以下问题:

  • 组合问题:N个数里面按一定规则找出k个数的集合

  • 切割问题:一个字符串按一定规则有几种切割方式

  • 子集问题:一个N个数的集合里有多少符合条件的子集

  • 排列问题:N个数按⼀定规则全排列,有几种排列方式

  • 棋盘问题:N皇后,解数独等等

2.2 回溯算法模板(python)

def backtracking(参数):#参数可根据实际情况进行修整if(终止条件):收集结果returnfor (集合中的元素):处理节点递归回溯return

3 全排列

3.1 思路

全排列的树结构可表示如下:

根据模板进行分析

(1)终止条件

当path的长度和nums的长度相同时,表示path已经得到了一个全排列组合,此时终止;

(2)收集结果

将终止时,path加入到结果res中,需要注意的是,由于回溯的撤销操作,path会不断发生改变,在添加结果时,应当使用path.copy(),防止后续修改影响已保存的结果;

(3)集合中元素

从给定的nums中进行选择

(4)处理节点

从nums中任选一个元素将其加入到path中

(5)递归

根据path的长度和变化的集合进行递归,变化的集合表示为s-{path}中已经存在的元素

(6)回溯

在 path[i] = x 赋值后,递归处理下一层。当递归返回时,当前层的循环继续执行,下一个 x 会直接覆盖 path[i] 的值,自然实现了状态的“回退”。因此,在本代码中无需显式撤销操作。

(7)参数

根据上述分析,可见递归的参数可表示为path的长度和变化的集合

3.2 完整代码

根据上述分析,可以得到完整代码:

class Solution:def permute(self, nums: List[int]) -> List[List[int]]:n = len(nums)res = []path = [0] * ndef backtracking(i,s):if i == n:res.append(path.copy())returnfor x in s:path[i] = xbacktracking(i+1, s-{x})backtracking(0,set(nums))return res

http://www.ppmy.cn/embedded/169929.html

相关文章

SpringBoot项目中替换指定版本的tomcat

在Spring Boot项目中替换指定版本的Tomcat,可以通过修改项目的pom.xml文件来实现。具体步骤如下: 首先,查看当前Spring Boot项目中使用的Tomcat版本。可以通过查看pom.xml文件中的依赖项来确定。 在pom.xml文件中,找到Spring Bo…

MySQL -操作

博客主页:【夜泉_ly】 本文专栏:【暂无】 欢迎点赞👍收藏⭐关注❤️ 文章目录 创建数据库格式编码集 操控数据库查看数据库修改数据库删除数据库备份与还原 部分表操作创建表查看表修改表 我的版本号:8.0.41-0ubuntu0.22.04.1 创…

探索Elasticsearch:文档的CRUD

在企业环境中,Elasticsearch对文档操作的支持不仅是实现高效搜索的关键,更是数据驱动决策的重要支柱。它通过强大的索引机制和灵活的查询语言,使企业能够实时处理和分析海量文档数据,迅速获取有价值的洞察,从而加速创新…

DataWorks (数据工厂)介绍

介绍 DataWorks 是阿里云推出的一体化大数据开发与治理平台,曾用名"数据工厂""大数据开发套件" 最新版本是3.0 它是一套基于MaxCompute(原ODPS)的DW(数据仓库)解决方案,它集成了阿里多年的DW实施经验&…

@update 的常见用法 Vue.js

在 Vue.js 中&#xff0c;update 是一个事件监听器&#xff0c;通常用于监听自定义组件或某些 Vue 原生组件&#xff08;如 <input> 或自定义组件&#xff09;的更新事件。它并不是 Vue 的核心 API&#xff0c;而是一种约定俗成的命名方式&#xff0c;用于处理组件内部状…

Vue3 Transition组件深度解析:结合Element Plus实践指南

引言 在Vue3的动画生态中&#xff0c;Transition组件是构建流畅交互体验的核心工具。本文将深入探讨其工作原理&#xff0c;并配合Element Plus组件库的实际案例&#xff0c;展示如何实现企业级应用的优雅过渡效果。 一、Transition组件核心机制 1.1 过渡类名生命周期 Vue3为…

【江科协-STM32】6. TIM编码器接口

1. 编码器接口简介 编码器接口(Encoder Interface)&#xff0c;可接收增量&#xff08;正交&#xff09;编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;自动控制CNT自增或自减&#xff0c;从而指示编码器的位置、旋转方向和旋转速度。 每个高级定时器…

美食推荐系统的微信小程序+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…