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

【leetcode100】全排列

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(终止条件):
        收集结果
        return
    for (集合中的元素):
        处理节点
        递归
        回溯
    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] * n
        def backtracking(i,s):
            if i == n:
                res.append(path.copy())
                return
            for x in s:
                path[i] = x
                backtracking(i+1, s-{x})
        backtracking(0,set(nums))
        return res

相关文章:

  • 【落羽的落羽 C++】C++入门基础:输入与输出,缺省参数,函数重载
  • FastGPT 源码:RRF、Rerank 相关代码
  • FastGPT 引申:基于 Python 版本实现 Java 版本 RRF
  • 源码编译安装httpd
  • 示例:在WPF中如何使用Segoe MDL2 Assets图标和使用该图标的好处
  • 算力100问☞第72问:算力与算法、数据的关系是什么?
  • JavaScript 变量命名规范
  • 自编码器——数据降维及特征提取
  • slf4j和log4j的区别与使用
  • Mysql从入门到精通day2————数据表操作
  • 第五十三:v-model修饰符
  • 深度学习之图像学习知识点
  • DeepSeek未来发展趋势:开创智能时代的新风口
  • 高频 SQL 50 题(基础版)_610. 判断三角形
  • IT产品经理如何打造优秀并具有影响力的产品
  • C# WinForm程序中如何调试dll接口
  • Leetcode 3468. Find the Number of Copy Arrays
  • 《大语言模型的原理发展与应用》:此文为AI自动生成
  • 从文件到块: 提高 Hugging Face 存储效率
  • angular实现nodejs增删改查
  • 总部基地网站建设/seo综合查询工具
  • 工程项目建设网站/上海百度推广排名优化
  • 怎么查看网站死链/搜索引擎优化工作
  • 店面设计绘画/seo优化推广工程师
  • 株洲知名网站建设/百度服务中心电话
  • wordpress加印章插件/seo关键词优化技巧