Python算法题集_子集

 Python算法题集_子集

  • 题78:子集
  • 1. 示例说明
  • 2. 题目解析
    • - 题意分解
    • - 优化思路
    • - 测量工具
  • 3. 代码展开
    • 1) 标准求解【递归】
    • 2) 改进版一【双层下标循环】
    • 3) 改进版二【双层枚举循环】
    • 4) 改进版三【双层下标循环+位运算】
    • 5) 改进版四【单行双层循环+位运算】
    • 6) 改进版五【高效迭代模块】
  • 4. 最优算法
  • 5. 相关资源

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

题78:子集

1. 示例说明

  • 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

    解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

    示例 1:

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

    示例 2:

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

    提示:

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

2. 题目解析

- 题意分解

  1. 本题是计算整数集合的全子集
  2. 基本的设计思路为从空集逐步增加元素到整数全集,可以用递归实现

- 优化思路

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

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

  3. 通常优化:减少内存使用量,减少独立变量数量

  4. 通常优化:采用内置算法、专业模块来提升计算速度

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

    1. 可以将每次增加元素后的结果集,用枚举方式遍历

    2. 可以考虑用0/1的位运算来标记元素是否放入结果集中

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


- 测量工具

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

3. 代码展开

1) 标准求解【递归】

使用递归合成子集

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

import CheckFuncPerf as cfpclass Solution:def subsets_base(self, nums):result = []ilen = len(nums)def dfs_subset(iPos, tmp):result.append(tmp)for jIdx in range(iPos, ilen):dfs_subset(jIdx + 1, tmp + [nums[jIdx]])dfs_subset(0, [])return resultaSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.subsets_base, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))# 运行结果
函数 subsets_base 的运行时间为 869.20 ms;内存使用量为 159380.00 KB 执行结果 = 1048576

2) 改进版一【双层下标循环】

下标遍历结果集,使用双层循环合成子集

页面功能测试,勉强通关,超过17%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def subsets_ext1(self, nums):result=[[]]ilen=len(nums)for iIdx in range(ilen):for jIdx in range(len(result)):result.append(result[jIdx]+[nums[iIdx]])return resultaSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.subsets_ext1, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))# 运行结果
函数 subsets_ext1 的运行时间为 738.17 ms;内存使用量为 157248.00 KB 执行结果 = 1048576

3) 改进版二【双层枚举循环】

枚举遍历结果集,使用双层循环合成子集

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

import CheckFuncPerf as cfpclass Solution:def subsets_ext2(self, nums):result = [[]]for aInt in nums:result = result + [[aInt] + num for num in result]return resultaSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.subsets_ext2, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))# 运行结果
函数 subsets_ext1 的运行时间为 738.17 ms;内存使用量为 157248.00 KB 执行结果 = 1048576

4) 改进版三【双层下标循环+位运算】

双层下标循环,通过位运算合成子集

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

import CheckFuncPerf as cfpclass Solution:def subsets_ext3(self, nums):result = []for iIdx in range(1 << len(nums)):tmp = []for jIdx in range(len(nums)):if iIdx & 1 << jIdx:tmp.append(nums[jIdx])result.append(tmp)return resultaSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.subsets_ext3, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))# 运行结果
函数 subsets_ext3 的运行时间为 2970.67 ms;内存使用量为 190108.00 KB 执行结果 = 1048576

5) 改进版四【单行双层循环+位运算】

双层循环一行代码,通过位运算合成子集,减少了中间变量

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

import CheckFuncPerf as cfpclass Solution:def subsets_ext4(self, nums):ilen = len(nums)return [[nums[jIdx] for jIdx in range(ilen) if iIdx & (1 << jIdx)] for iIdx in range(1 << ilen)]aSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.subsets_ext4, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))# 运行结果
函数 subsets_ext4 的运行时间为 2622.59 ms;内存使用量为 190936.00 KB 执行结果 = 1048576

6) 改进版五【高效迭代模块】

使用高效迭代模块itertools来合成子集

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

import CheckFuncPerf as cfpclass Solution:def subsets_ext5(self, nums):import itertoolsresult = []for iIdx in range(len(nums) + 1):result += [tmp for tmp in itertools.combinations(nums, iIdx)]return resultaSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.subsets_ext2, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))# 运行结果
函数 subsets_ext5 的运行时间为 115.02 ms;内存使用量为 139632.00 KB 执行结果 = 1048576

4. 最优算法

根据本地日志分析,最优算法为第6种方式【高效迭代模块】subsets_ext5

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

  1. 枚举循环性能优于下标循环
  2. itertool模块应该是用C等语言实现,效率远高于Python代码逐行实现
nums = [x for x in range(20)]
aSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.subsets_base, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))
result = cfp.getTimeMemoryStr(aSolution.subsets_ext1, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))
result = cfp.getTimeMemoryStr(aSolution.subsets_ext2, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))
result = cfp.getTimeMemoryStr(aSolution.subsets_ext3, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))
result = cfp.getTimeMemoryStr(aSolution.subsets_ext4, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))
result = cfp.getTimeMemoryStr(aSolution.subsets_ext5, nums)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))# 算法本地速度实测比较
函数 subsets_base 的运行时间为 869.20 ms;内存使用量为 159380.00 KB 执行结果 = 1048576
函数 subsets_ext1 的运行时间为 738.17 ms;内存使用量为 157248.00 KB 执行结果 = 1048576
函数 subsets_ext2 的运行时间为 560.14 ms;内存使用量为 156068.00 KB 执行结果 = 1048576
函数 subsets_ext3 的运行时间为 2970.67 ms;内存使用量为 190108.00 KB 执行结果 = 1048576
函数 subsets_ext4 的运行时间为 2622.59 ms;内存使用量为 190936.00 KB 执行结果 = 1048576
函数 subsets_ext5 的运行时间为 115.02 ms;内存使用量为 139632.00 KB 执行结果 = 1048576

5. 相关资源

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

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

may the odds be ever in your favor ~

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

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

相关文章

算法沉淀——动态规划之子数组、子串系列(上)(leetcode真题剖析)

算法沉淀——动态规划之子数组、子串系列 01.最大子数组和02.环形子数组的最大和03.乘积最大子数组04.乘积为正数的最长子数组长度 01.最大子数组和 题目链接&#xff1a;https://leetcode.cn/problems/maximum-subarray/、 给你一个整数数组 nums &#xff0c;请你找出一个具…

golang学习6,glang的web的restful接口传参

1.get传参 //get请求 返回json 接口传参r.GET("/getJson/:id", controller.GetUserInfo) 1.2.接收处理 package controllerimport "github.com/gin-gonic/gin"func GetUserInfo(c *gin.Context) {_ c.Param("id")ReturnSucess(c, 200, &quo…

DSP,QX320F280049C,完整版使用手册,数据手册

32位双核CPU&#xff0c; 主频150MHz 支持FPU、VCU、TPU flash 1MB SRAM 500KB 3个3MSPS&#xff0c;12位 ADC 24个增强型ePWM 16个高分辨率HRPWM&#xff08;150PS&#xff09;

顶顶通呼叫中心中间件-如何使处于机器人话术中的通话手动转接到坐席分机上讲解(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件使用httpapi实现电话转接操作过程讲解(mod_cti基于FreeSWITCH) 需要了解呼叫中心中间件可以点以下链接了解顶顶通小孙 1、使用httpapi接口转接 一、打开web版的ccadmin并且找到接口测试 打开web-ccadmin并且登录&#xff0c;登录完成之后点击运维调试-再…

Linux使用Docker部署在线协作白板WBO并结合内网穿透发布公网远程访问

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板&#xff0c;允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…

【JavaEE】_前端POST请求借助form表单向后端传参

对于POST请求&#xff0c;可以通过body部分来传递参数&#xff1b; 对于通过form表单的方式将POST请求的参数传递给后端来说&#xff0c;body部分的格式就是query string的格式&#xff0c;即form表单&#xff1b; 此时请求报头部分有&#xff1a;Content-Type : application…

spring框架Bean的作用域?对需要保持会话状态的bean应使用prototype作用域?为啥?

当一个bean被定义为"prototype"作用域时&#xff0c;每次请求该bean时都会创建一个新的实例&#xff0c;而不是像"singleton"作用域那样共享同一个实例。 对于需要保持会话状态的bean&#xff0c;如果使用"singleton"作用域&#xff0c;会导致所…

MATLAB中的稀疏矩阵和密集矩阵

在MATLAB中&#xff0c;矩阵可以表示为密集或稀疏格式。通常&#xff0c;矩阵默认以密集格式存储&#xff0c;这意味着每个元素都明确地存储在内存中&#xff0c;无论它的值是多少。然而&#xff0c;当矩阵含有大量的零元素时&#xff0c;这种存储方式就会变得非常低效。为了更…

Window系统本地搭建LightPicture网站并实现远程上传下载本地图片

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进&#xff0c;功能也越来越多&#xff0c;而手机…

后端程序员入门react笔记(五)ajax请求

常见的ajax Ajax 最原始的方式&#xff0c;基于原生的js XmlHttpRequest 多个请求之间如果有先后关系&#xff0c;会存在很多层回调的问题&#xff0c;也是基于原生js Jquery Ajax 基于原生XHR封装&#xff0c;依赖Jquery框架&#xff0c;由jquery 框架去封装原生的XML(Xml)封…

GaussDB SQL调优:选择合适的分布列

一、背景 GaussDB是华为公司倾力打造的自研企业级分布式关系型数据库&#xff0c;该产品具备企业级复杂事务混合负载能力&#xff0c;同时支持优异的分布式事务&#xff0c;同城跨AZ部署&#xff0c;数据0丢失&#xff0c;支持1000扩展能力&#xff0c;PB级海量存储等企业级数…

策略模式:封装行为策略,灵活切换实现多态业务逻辑

文章目录 一、引言二、应用场景三、模式定义与实现四、优缺点分析总结 一、引言 ​ 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了算法族&#xff0c;并分别封装起来&#xff0c;让它们之间可以互相替换。这种模式使得算法的变化…

Java+SpringBoot+Vue+MySQL构建银行客户管理新平台

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

电感电流波形分析

电感电流波形分析 首先&#xff0c;当电感充电时候&#xff08;红色回路&#xff09;电感左右两端是左正右负 假设在初始状态下&#xff0c;电容两端电压是0V&#xff0c;可以看出来A点电位是400V&#xff0c;B和C两端电容也都是0V 根据电感表达式di/dtUL/L400V/L 所以看得出…

【OnlyOffice】 桌面应用编辑器,版本8.0已发布,PDF表单、RTL支持、Moodle集成、本地界面主题

ONLYOFFICE桌面编辑器v8.0是一款功能强大、易于使用的办公软件&#xff0c;适用于个人用户、企业团队和教育机构&#xff0c;帮助他们高效地处理文档工作并实现协作。无论是在Windows、macOS还是Linux平台上&#xff0c;ONLYOFFICE都能提供无缝的编辑和共享体验。 目录 ONLYOFF…

华为高级路由技术 2023-2024

2023-2024 一、2.26路由协议版本优先级和度量主和备路由最长匹配原则递归路由和默认路由 一、2.26 路由协议版本 &#xff08;1&#xff09;RIP&#xff1a; IPv4网&#xff1a;RIPv1&#xff0c;RIPv2&#xff08;v1和v2 不兼容&#xff09; IPv6网&#xff1a;RIPng(Next g…

【网站项目】475商城系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

羊大师解读,羊奶都拥有哪些特点?

羊大师解读&#xff0c;羊奶都拥有哪些特点&#xff1f; 羊奶除了上述提到的丰富营养成分和健康优势外&#xff0c;还有以下一些特点&#xff1a; 接近母乳&#xff1a;羊奶的分子结构与母乳非常相似&#xff0c;特别是其含有大量的乳清蛋白&#xff0c;这使得羊奶成为婴儿和…

动态规划课堂2-----路径问题

目录 引言&#xff1a; 例题1&#xff1a;不同路径 例题2&#xff1a;不同路径II 例题3&#xff1a;礼物的最⼤价值 例题4&#xff1a;下降路径最⼩和 例题5&#xff1a;最小路径和 结语&#xff1a; 引言&#xff1a; 在学习完动态规划斐波那契数列模型后&#xff0c;…

【正式成立】工业互联网甄选联盟

工业互联网甄选联盟 联盟文件&#xff08;PDF&#xff09;&#xff1a;下载链接&#xff0c;提取码&#xff1a;m5d7 依托将近20年工业领域的智能制造相关项目实施经验、管理经验和产品开发经验&#xff1b;依托iNeuOS工业互联网操作系统、人工智能物流系统、MES制造执行系统等…