Python面试宝典第27题:全排列

题目

        给定一个不含重复数字的数组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:

输入:nums = [0,1]
输出:[[0,1], [1,0]]

        示例 3:

输入:nums = [1]
输出:[[1]]

回溯法

        回溯法求解本题的基本思想是:递归地构建全排列,在每个递归层,从剩余未被使用的数字中选择一个数字;当一个排列构建完成或无法继续构建时,撤销上一步的选择并尝试下一个数字。使用回溯法求解本题的主要步骤如下。

        1、初始化。定义一个空列表用来存储结果。

        2、选择。在每一步中,选择一个尚未使用过的数字加入到当前排列中。

        3、递归。递归到下一层,继续选择下一个数字。

        4、回溯。如果当前排列已经完成(即包含所有数字),则将这个排列添加到结果列表中。否则,撤销本次选择,回溯至上一步,尝试下一个数字。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def permutation_by_backtrack(nums):def backtrack(start = 0):if start == n:# 如果当前排列已经填满,则加入结果集result.append(nums[:])returnfor i in range(start, n):# 交换元素以产生新的排列nums[start], nums[i] = nums[i], nums[start]# 递归地填充下一个位置backtrack(start + 1)# 回溯,撤销操作nums[start], nums[i] = nums[i], nums[start]n = len(nums)result = []backtrack()return resultprint(permutation_by_backtrack([1, 2, 3]))
print(permutation_by_backtrack([0, 1]))
print(permutation_by_backtrack([1]))

迭代法

        迭代法求解本题时,我们可以从空数组开始,逐步增加元素。每次增加一个新元素时,都将这个新元素插入到之前得到的所有排列的每一个可能的位置中。使用回溯法求解本题的主要步骤如下。

        1、初始化。创建一个列表,存储当前所有的排列组合,初始为空数组。

        2、迭代。对于输入数组中的每一个元素,将这个元素插入到当前所有排列的每一个可能的位置。

        3、更新。更新排列组合列表,直到所有元素都被处理完毕。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def permutation_by_iteration(nums):results = [[]]for num in nums:new_results = []for result in results:# 将当前元素插入到排列的每一个可能的位置for i in range(len(result) + 1):# 复制排列,并在适当位置插入当前元素new_result = list(result)new_result.insert(i, num)new_results.append(new_result)# 更新结果列表results = new_resultsreturn resultsprint(permutation_by_iteration([1, 2, 3]))
print(permutation_by_iteration([0, 1]))
print(permutation_by_iteration([1]))

总结

        使用回溯法和迭代法求解本题的时间复杂度均为O(N * N!),这是因为,对于一个长度为N的序列,有N!种排列方式,每一种排列都需要O(N)的时间来构建。回溯法的空间复杂度为O(N),主要是递归栈的空间消耗,最坏情况下递归的深度为N。迭代法的空间复杂度也为O(N),此时需要使用额外的数据结构来存储中间状态。

        总的来说,回溯法更易于理解和实现,适用于较小规模的问题,但在大规模数据上可能会受到递归深度限制的影响。迭代法在处理大规模数据时表现更好,因为它避免了递归带来的开销,但实现起来稍微复杂一些。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/391668.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA开发——数码管的使用(二)

一、概述 在上一篇文章中我们针对单个数码管的静态显示和动态显示进行了一个设计和实现,这篇文章中我们针对多个数码管同时显示进行一个设计。这里和上一篇文章唯一不同的是就是数码管位选进行了一个改变,原来是单个数码管的显示,所以位选就直…

详细说明Java中Map和Set接口的使用方法

Map与Set的基本概念与场景 Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。以前常见的搜索方式有: 1. 直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢。 2. 二分查找&#x…

WordPress网站被入侵,劫持收录事件分析

7.15,网站被入侵,但是直到7月17日,我才发现被入侵。 16日,17日正常更新文章,17日查询网站收录数据时,在站长资源平台【流量与关键词】查询上,我发现了比较奇怪的关键词。 乱码关键词排名 起初…

JavaDS —— AVL树

前言 本文章将介绍 AVL 树的概念,重点介绍AVL 树的插入代码是如何实现的,如果大家对 AVL 树的删除(还是和二叉搜索树一样使用的是替换删除法,然后需要判断是否进行旋转调整)感兴趣的话,可以自行去翻阅其他…

关于Unity转微信小程序的流程记录

1.准备工作 1.unity微信小程序转换工具,minigame插件,导入后工具栏出现“微信小游戏" 2.微信开发者工具稳定版 3.MP微信公众平台申请微信小游戏,获得游戏appid 4.unity转webgl开发平台,Player Setting->Other Setting…

市场主流 AI 视频生成技术的迭代路径

AI视频生成技术的迭代路径经历了从GANVAE、Transformer、Diffusion Model到Sora采用的DiT架构(TransformerDiffusion)等多个阶段,每个阶段的技术升级都在视频处理质量上带来了飞跃性的提升。这些技术进步不仅推动了AI视频生成领域的快速发展&…

评估生成分子/对接分子的物理合理性工具 PoseBusters 评测

最近在一些分子生成或者对接模型中,出现了新的评估方法 PoseBusters,用于评估生成的分子或者对接的分子是否符合化学有效性和物理合理性。以往的分子生成,经常以生成分子的有效性、新颖性、化学空间分布,与口袋的结合力等方面进行…

微软蓝屏事件揭示的网络安全深层问题与未来应对策略

目录 微软蓝屏事件揭示的网络安全深层问题与未来应对策略 一、事件背景 二、事件影响 2.1、跨行业连锁反应 2.2、经济损失和社会混乱 三、揭示的网络安全问题 3.2、软件更新管理与风险评估 3.2、系统复杂性与依赖关系 3.3、网络安全意识与培训 四、未来的网络安全方向…

网络云相册实现--nodejs后端+vue3前端

目录 主页面 功能简介 系统简介 api 数据库表结构 代码目录 运行命令 主要代码 server apis.js encry.js mysql.js upload.js client3 index.js 完整代码 主页面 功能简介 多用户系统,用户可以在系统中注册、登录及管理自己的账号、相册及照片。 每…

众人帮蚂蚁帮任务平台修复版源码,含搭建教程。

全修复运营版本的任务平台,支持垂直领域细分,定向导流,带有排行榜功能,任务发布上传审核,用户信用等级,充值接口等等均完美可用。支付对接Z支付免签接口,环境配置及安装教程都已经打包。 搭建环…

C语言调试宏全面总结(六大板块)

C语言调试宏进阶篇:实用指南与案例解析C语言调试宏高级技巧与最佳实践C语言调试宏的深度探索与性能考量C语言调试宏在嵌入式系统中的应用与挑战C语言调试宏在多线程环境中的应用与策略C语言调试宏在并发编程中的高级应用 C语言调试宏进阶篇:实用指南与案…

【Linux】网络基础_4

文章目录 十、网络基础5. socket编程网络翻译服务 未完待续 十、网络基础 5. socket编程 网络翻译服务 基于UDP&#xff0c;我们实现一个简单的翻译。 我们导入之前写的代码&#xff1a; InetAddr.hpp&#xff1a; #pragma once#include <iostream> #include <sys…

开源智能低代码自动化助手:Obsei

**Obsei&#xff1a;**低代码&#xff0c;高效率&#xff0c;Obsei让AI自动化触手可及。- 精选真开源&#xff0c;释放新价值。 概览 Obsei是一款开源的低代码人工智能自动化工具&#xff0c;它为企业提供了一套灵活的解决方案&#xff0c;以应对日益增长的数据处理需求。该工…

uvm_config_db 和 uvm_resource_db :

uvm_config_db class my_driver extends uvm_driver;int my_param;function new(string name, uvm_component parent);super.new(name, parent);endfunctionvirtual task run_phase(uvm_phase phase);// 在组件内部获取配置值if (!uvm_config_db#(int)::get(this, ""…

[Git][远程操作]详细讲解

1.理解分布式版本控制系统 形象理解&#xff1a;每个⼈的电脑上都是⼀个完整的版本库 这样⼯作的时候&#xff0c;就不需要联⽹了&#xff0c; 因为版本库就在⾃⼰的电脑上 既然每个⼈电脑上都有⼀个完整的版本库&#xff0c;那多个⼈如何协作呢&#xff1f; 例如&#xff1a;…

ajax图书管理项目

bootstrap弹框 不离开当前页面&#xff0c;显示单独内容&#xff0c;让用户操作 功能&#xff1a;不离开当前页面&#xff0c;显示单独内容&#xff0c;供用户操作步骤&#xff1a; 1.引入bootstrap.css和bootstrap.js …

Stegdetect教程:如何用Stegdetect检测和破解JPG图像隐写信息

一、Stegdetect简介 Stegdetect 是一个开源工具&#xff0c;专门设计用于检测图像文件&#xff08;JPG格式&#xff09;中的隐写信息。Stegdetect 可以检测多种常见的隐写方法&#xff0c;比如 JSteg、JPHide 和 OutGuess 等。 二、使用Stegdetect检测图像隐写 官方描述&#…

NSS [SWPUCTF 2022 新生赛]file_master

NSS [SWPUCTF 2022 新生赛]file_master 开题&#xff0c;一眼文件上传。 network看看返回包。后端语言是PHP。 除了文件上传还有个查看文件功能。 起手式查询/etc/passwd&#xff0c;发现查询方法是GET提交参数&#xff0c;后端使用file_get_contents()函数包含文件。同时有op…

企业级业务架构设计探讨

引言 在数字化转型的浪潮中&#xff0c;企业业务架构的设计成为了连接企业战略与技术实现的桥梁&#xff0c;其重要性日益凸显。本文探讨企业级业务架构的设计原则、流程、工具和技术实现&#xff0c;并结合具体案例&#xff0c;为读者提供参考。 一、设计原则&#xff1a;奠…

KubeSphere 部署的 Kubernetes 集群使用 GlusterFS 存储实战入门

转载&#xff1a;KubeSphere 部署的 Kubernetes 集群使用 GlusterFS 存储实战入门 知识点 定级&#xff1a;入门级 GlusterFS 和 Heketi 简介 GlusterFS 安装部署 Heketi 安装部署 Kubernetes 命令行对接 GlusterFS 实战服务器配置(架构1:1复刻小规模生产环境&#xff0c;…