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

news2024/9/30 7:25:31

题目

        给定一个不含重复数字的数组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[:])
            return
        
        for 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 result

print(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_results
    
    return results

print(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.coloradmin.cn/o/1980061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt之Gui

组件依赖关系 应用 #mermaid-svg-GADicZtZJRVVUeiF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GADicZtZJRVVUeiF .error-icon{fill:#552222;}#mermaid-svg-GADicZtZJRVVUeiF .error-text{fill:#552222;stroke:#…

【Spark计算引擎----第三篇(RDD)---《深入理解 RDD:依赖、Spark 流程、Shuffle 与缓存》】

前言: 💞💞大家好,我是书生♡,本阶段和大家一起分享和探索大数据技术Spark—RDD,本篇文章主要讲述了:RDD的依赖、Spark 流程、Shuffle 与缓存等等。欢迎大家一起探索讨论!&#xff0…

【Gold菜鸟】Linux知识回忆(8)——进程和计划任务

前言 这部分让我们来继续了解Linux中进程和计划任务的相关知识吧~ 相关技术交流欢迎添加VX: wenjinworkon 目录 进程和内存管理 什么是进程 进程结构 进程相关概念 物理地址空间和虚拟地址空间 用户和内核空间 进程使用内存问题 进程状态 内存淘汰数据机制:…

数学建模评价类—Topsis法

目录 文章目录 前言 切记:以下内容仅用于参考理解,不可用于数模竞赛!!! 一、Topsis的基本原理 二、Topsis的建模过程 1.判断矩阵是否需要正向化 2.原始矩阵正向化 3.矩阵标准化 4.计算距离,给出得…

Can Large Language Models Provide Feedback to Students? A Case Study on ChatGPT

文章目录 题目摘要相关工作方法结果讨论意义 题目 大型语言模型能为学生提供反馈吗?ChatGPT 案例研究 论文地址:https://ieeexplore.ieee.org/abstract/document/10260740 摘要 摘要——教育反馈已被广泛认为是提高学生学习能力的有效方法。然而&#x…

Python | Leetcode Python题解之第322题零钱兑换

题目: 题解: class Solution:def coinChange(self, coins: List[int], amount: int) -> int:dp [float(inf)] * (amount 1)dp[0] 0for coin in coins:for x in range(coin, amount 1):dp[x] min(dp[x], dp[x - coin] 1)return dp[amount] if d…

Python的if语句及其运用

一、条件测试 每条if语句的核心都是一个值为True或False的表达式,这种表达式称为条件测试。如果测试的条件满足if语句则为True,接着执行if里的语句;如果测试的条件不满足if语句则为False,则不执行if里的语句。 1.1、检查是否相等…

C++ | Leetcode C++题解之第322题零钱兑换

题目&#xff1a; 题解&#xff1a; class Solution { public:int coinChange(vector<int>& coins, int amount) {int Max amount 1;vector<int> dp(amount 1, Max);dp[0] 0;for (int i 1; i < amount; i) {for (int j 0; j < (int)coins.size();…

二叉树(真题)

1.用非递归遍历求二叉树结点个数【计学2020】 算法思想:用先序非递归遍历 当前指针不为空或栈不为空进行循环&#xff1b; 当前指针不为空访问当前结点&#xff0c;当前节点入栈&#xff0c;进入左子树 当前指针为空&#xff0c;栈顶元素出栈&#xff08;回溯&#xff09;&…

【kickstart+pxe批量安装linux系统】

目录 一、实验环境准备二、安装kickstart1、kickstart自动安装脚本的制作 三、安装web服务器&#xff0c;提供网络源四、安装dhcp五、安装syslinux&#xff0c;tftp-server六、虚拟机中新建新主机 一、实验环境准备 1、rhel7主机 2、开启主机图形 init 5 开图形 3、配置网络可…

ESP8266 烧录,待坑

ets Jan 8 2013,rst cause:1, boot mode:(7,0)waiting for host 空芯片&#xff0c;未加SPI FLASH 显示 下载模式(IO15 10k下拉 &#xff0c; IO0下拉 &#xff08;直接GND),IO2上拉&#xff08;文档上说是有内部上拉的&#xff0c;先上拉&#xff09;&#xff09; &#xff…

jdbc(mysql)

1.概述 jdbc&#xff1a;java database connection&#xff08;java与数据库连接&#xff09; java可以连接不同数据库&#xff0c;不同数据库连接细节不同&#xff0c;具体细节都由数据库自己实现 由java设计出一系列连接数据库的接口规范&#xff0c;然后由不同的数据库开发…

C语言程序设计26

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题2.3 上机运行下面的程序&#xff0c;分析输出结果 代码 //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //习题2.3 上机运行下面的程序&#xff0c;分析输出结果#include <stdio.h> int …

【MYSQL】MYSQL逻辑架构

mysql逻辑架构分为3层 mysql逻辑架构分为3层 1). 连接层&#xff1a;主要完成一些类似连接处理&#xff0c;授权认证及相关的安全方案。 2). 服务层&#xff1a;在 MySQL据库系统处理底层数据之前的所有工作都是在这一层完成的&#xff0c;包括权限判断&#xff0c;SQL接口&…

GD 32 IIC通信协议

前言&#xff1a; ... 通信方式 通信方式分为串行通信和并行通信。常见的串口就是串行通信的方式 常用的串行通信接口 常用的串行通信方式有USART,IIC,USB,CAN总线 同步与异步 同步通信&#xff1a;IIC是同步通信&#xff0c;有两个线一个是时钟信号线&#xff0c;一个数数据…

rocketMq-5.2.0双主双从搭建

最近在研究rocketmq5.x的运行机制&#xff0c;研究到高可用章节&#xff0c;看到rocketMq采用了主从机制实现高可用&#xff0c;将broker分成了master和slave。为了更好的理解主从源码&#xff0c;我觉着需要先搭建一个主从的集群&#xff0c;先了解主从集群是怎么使用的。 这篇…

【practise】只出现一次的数字

现在给你一个数组&#xff0c;里面放了一些数字&#xff0c;里面都是两两成对&#xff0c;只有一个数字是单独的&#xff0c;要求找出其中只出现一次的数字。相必这道题是非常简单了&#xff0c;有很多解法比如说用暴力求解&#xff1f;比如说用位运算&#xff1f;甚至说用哈希…

使用Docker+ollama部署大模型

Docker的安装----在 Ubuntu 系统上安装 Docker 一&#xff1a;配置系统的 APT 软件包管理器 首先添加 Docker 的官方 GPG 密钥 # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/ke…

使用 宝塔面板 部署 php网站

【语料库网站】宝塔面板 在线部署全过程 代码仓库&#xff1a;https://github.com/talmudmaster/RedCorpus 网站介绍 语料库提供双语文本检索和分享功能。供英语、翻译相关专业的爱好者&#xff0c;学生和老师学习使用。 该网站是对BiCorpus开源项目的二次开发。 技术栈&am…

DA14695 printf没办法打印浮点数

是因为没有打开浮点数库&#xff0c;添加了这个库也会导致堆内存的增加