Python算法题集_全排列

 Python算法题集_全排列

  • 题46:全排列
  • 1. 示例说明
  • 2. 题目解析
    • - 题意分解
    • - 优化思路
    • - 测量工具
  • 3. 代码展开
    • 1) 标准求解【标记数组+递归】
    • 2) 改进版一【指针+递归】
    • 3) 改进版二【高效迭代模块】
    • 4) 改进版三【高效迭代模块+极简代码】
  • 4. 最优算法
  • 5. 相关资源

本文为Python算法题集之一的代码示例

题46:全排列

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:

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

    示例 3:

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

    提示:

    • 1 <= nums.length <= 6
    • -10 <= nums[i] <= 10
    • nums 中的所有整数 互不相同

2. 题目解析

- 题意分解

  1. 本题是计算集合的全排列组合
  2. 基本的设计思路是递归计算组合

- 优化思路

  1. 通常优化:减少循环层次

  2. 通常优化:增加分支,减少计算集

  3. 通常优化:采用内置算法来提升计算速度

  4. 分析题目特点,分析最优解

    1. 每加一个元素,添加的组合等于旧元素全排列集合与新元素各排列一次,以此递归

    2. 可以考虑用高效迭代模块单元itertools


- 测量工具

  • 本地化测试说明:LeetCode网站测试运行时数据波动很大【可把页面视为功能测试】,因此需要本地化测试解决数据波动问题
  • CheckFuncPerf(本地化函数用时和内存占用测试模块)已上传到CSDN,地址:Python算法题集_检测函数用时和内存占用的模块
  • 本题本地化超时测试用例自己生成,详见章节【最优算法】,代码文件包含在【相关资源】中

3. 代码展开

1) 标准求解【标记数组+递归】

使用标记数组记录前置组合,递归求解

页面功能测试,马马虎虎,超过54%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def permute_base(self, nums):paths = []ilen = len(nums)def dfspermute(nums, path):if len(path) == ilen:paths.append(path[:])returnfor num in nums:pathleft = path[:]pathleft.append(num)numsresidue = nums[:]numsresidue.remove(num)dfspermute(numsresidue, pathleft)dfspermute(nums, [])return pathsaSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.permute_base, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))# 运行结果
函数 permute_base 的运行时间为 6231.28 ms;内存使用量为 549252.00 KB 执行结果 = 3628800

2) 改进版一【指针+递归】

使用指针标记数组记录前置位置,递归求解

页面功能测试,性能卓越,超越95%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def permute_ext1(self, nums):def permutation_sub(ls, start, result):if start == len(ls) - 1:result.append(list(ls))returnfor i in range(start, len(ls)):ls[i], ls[start] = ls[start], ls[i]permutation_sub(ls, start + 1, result)ls[i], ls[start] = ls[start], ls[i]perm = []permutation_sub(nums, 0, perm)return permaSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.permute_ext1, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))# 运行结果
函数 permute_ext1 的运行时间为 4993.29 ms;内存使用量为 760188.00 KB 执行结果 = 3628800

3) 改进版二【高效迭代模块】

使用高效迭代模块itertool的迭代器直接实现全排列功能

页面功能测试,性能良好,超过90%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def permute_ext2(self, nums):import itertoolslist_result = []for perm in itertools.permutations(nums):list_result.append(list(perm))return list_resultaSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.permute_ext2, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))# 运行结果
函数 permute_ext2 的运行时间为 2189.55 ms;内存使用量为 759268.00 KB 执行结果 = 3628800

4) 改进版三【高效迭代模块+极简代码】

使用高效迭代模块itertool的迭代器,直接一行生成结果,减少中间变量

页面功能测试,马马虎虎,超过46%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def permute_ext3(self, nums):import itertoolsreturn [list(perm) for perm in itertools.permutations(nums)]aSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.permute_ext3, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))# 运行结果
函数 permute_ext3 的运行时间为 2016.28 ms;内存使用量为 759028.00 KB 执行结果 = 3628800

4. 最优算法

根据本地日志分析,最优算法为第4种方式【高效迭代模块+极简代码】permute_ext3

本题测试数据,似乎能推出以下结论:

  1. 减少操作的独立变量,可以提升极限性能【未必可保证可读性】
  2. itertool模块应该是用C等语言实现,效率远高于Python代码逐行实现
nums = [x for x in range(10)]
aSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.permute_base, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))
result = cfp.getTimeMemoryStr(aSolution.permute_ext1, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))
result = cfp.getTimeMemoryStr(aSolution.permute_ext2, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))
result = cfp.getTimeMemoryStr(aSolution.permute_ext3, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))# 算法本地速度实测比较
函数 permute_base 的运行时间为 6231.28 ms;内存使用量为 549252.00 KB 执行结果 = 3628800
函数 permute_ext1 的运行时间为 4993.29 ms;内存使用量为 760188.00 KB 执行结果 = 3628800
函数 permute_ext2 的运行时间为 2189.55 ms;内存使用量为 759268.00 KB 执行结果 = 3628800
函数 permute_ext3 的运行时间为 2016.28 ms;内存使用量为 759028.00 KB 执行结果 = 3628800

5. 相关资源

本文代码已上传到CSDN,地址:Python算法题源代码_LeetCode(力扣)_全排列

一日练,一日功,一日不练十日空

may the odds be ever in your favor ~

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

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

相关文章

猫头虎分享已解决Bug || 未找到资源:NotFoundError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

qt debug和release运行都没问题打包之后运行不了

&#x1f482; 个人主页:pp不会算法^ v ^ &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 问题 qt debug和release运行都没问题打包之后运行不了 原因 环…

编码器转动圈数和单圈脉冲数计算FB(博途SCL代码)

编码器测量相关内容&#xff0c;可以查看专栏相关文章。 1、Smart PLC多圈和单圈脉冲数计算 https://rxxw-control.blog.csdn.net/article/details/131777270https://rxxw-control.blog.csdn.net/article/details/131777270 1、博途PLC 计算FB 待续....

OpenCV开发笔记(七十五):相机标定矫正中使用remap重映射进行畸变矫正

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/136293833 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 红胖子(红模仿…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(九)NodeJS入门——http模块

060_http模块_网页URL之绝对路径 hello&#xff0c;大家好&#xff0c;这一个小题的话我们来补充一个之前学习过的内容&#xff0c;就是网页当中的URL&#xff0c;咱们这个小题的话主要是来说一下绝对路径&#xff0c;有同学可能会说&#xff0c;这这这&#xff0c;不对劲&…

【c语言】字符函数和字符串函数(下)

前言 书接上回 【c语言】字符函数和字符串函数(上) 上一篇讲解的strcpy、strcat、strcmp函数的字符串长度是不受限制的 而本篇strncpy、strncat、strcnmp函数的字符串长度是受限制的 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;…

Linux系统中前后端分离项目部署指南

目录 一.nginx安装以及字启动 解压nginx 一键安装4个依赖 安装nginx 启动 nginx 服务 开放端口号 并且在外部访问 设置nginx自启动 二.配置负载均衡 1.配置一个tomact 修改端口号 8081端口号 2.配置负载均衡 ​编辑 三.部署前后端分离项目 1.项目部署后端 ​编辑…

linux逻辑卷/dev/mapper/centos-root扩容增加空间

centos7中/dev/mapper/centos-root扩容 问题文件系统根目录&#xff0c;/dev/mapper/centos-root空间满了&#xff0c;导致k8s不停重启 1.查看磁盘情况 df -h #查看最大占用目录 du -h -x --max-depth12.查看磁盘信息 fdisk -l3.查看磁盘分区层级 lsblk可见剩余空闲60G空间…

进程间通信:共享内存与信号灯集(2024/2/26)

作业1&#xff1a;共享内存 shmsnd.c: #include <myhead.h> #define PAGE_SIZE 4096int main(int argc, const char *argv[]) {//一、创建key值key_t key-1;if((keyftok("/",k))-1){perror("ftok error");return -1;}//二、根据key值创建共享内存i…

开源软件的影响力:推动软件行业繁荣与技术创新

开源软件的影响力&#xff1a;推动软件行业繁荣与技术创新 随着信息技术的快速发展&#xff0c;开源软件已经成为软件开发的趋势&#xff0c;并产生了深远的影响。开源软件的低成本、可协作性和透明度等特点&#xff0c;使得越来越多的企业和个人选择使用开源软件&…

《论文阅读》一个基于情感原因的在线共情聊天机器人 SIGIR 2021

《论文阅读》一个基于情感原因的在线共情聊天机器人 前言简介数据集构建模型架构损失函数实验结果咨询策略总结前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天为大家带来的是《Towards an Online Empathetic Chatbot…

光纤测试中链路插入损耗极限值的计算方法?(及其重要)

在日常测试中&#xff0c;有很多朋友使用DTX-1800或者DSX-5000测试光纤链路时&#xff0c;对于光损耗的计算有疑问&#xff0c;为什么同一批次光纤&#xff0c;有的pass有的fail&#xff0c;今天就此问题&#xff0c;展开一下&#xff1a; 135 375 00200 光纤链路损耗光纤损耗…