Python算法题集_子集

news2025/2/25 15:58:07

 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 cfp

class 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 result

aSolution = 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 cfp

class 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 result

aSolution = 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 cfp

class Solution:
 def subsets_ext2(self, nums):
     result = [[]]
     for aInt in nums:
         result = result + [[aInt] + num for num in result]
     return result

aSolution = 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 cfp

class 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 result

aSolution = 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 cfp

class 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 cfp

class Solution:
 def subsets_ext5(self, nums):
     import itertools
     result = []
     for iIdx in range(len(nums) + 1):
         result += [tmp for tmp in itertools.combinations(nums, iIdx)]
     return result

aSolution = 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://www.coloradmin.cn/o/1473868.html

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

相关文章

C#区域医院云LIS信息管理系统源码 标本管理、两癌筛查、数据分析、试剂管理

目录 ​编辑 区域医院云LIS系统功能亮点&#xff1a; 云LIS系统功能&#xff1a; 一、 基础管理 二、 前处理&#xff08;实验室&#xff09; 三、 标本处理 四、 样本检验 五、 统计报表 六、 质控管理 七、 基本工作流程 区域LIS系统特点&#xff1…

mapbox高德地图与相机

高德地图与相机 演示效果引入 CDN 链接地图显示 创建地图实例定义地图数据源配置地图图层 设置地图样式实现代码 1. 演示效果 本案例使用Mapbox GL JavaScript库创建高德地图。 2. 引入 CDN 链接 <script src"https://api.mapbox.com/mapbox-gl-js/v2.12.0/mapbox-gl.j…

华为算法题 go语言或者python

1 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返…

端侧显著性检测新高度,OPPO提出面向真实场景的PSUNet

https://arxiv.org/abs/2312.07100 在高分辨率场景下&#xff0c;现有的显著目标检测方法难以同时满足快速推理和准确结果的要求。它们受到用于高分辨率图像的公共数据集和高效网络模块的质量的限制。 为了缓解这些问题&#xff0c;我们构建一个显著对象匹配数据集HRSON和一个…

Windows已经安装了QT 6.3.0,如何再安装一个QT 5.12

要在Windows上安装Qt 5.12&#xff0c;您可以按照以下步骤操作&#xff1a; 下载Qt 5.12&#xff1a;访问Qt官方网站或其他可信赖的来源&#xff0c;下载Qt 5.12的安装包。 下载安装地址 下载安装详细教程 安装问题点 qt安装时“Error during installation process(qt.tools…

蒋勤勤48岁亮相,新穿法惊艳全场:上商务下夜店。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 蒋勤勤与陈建斌的恩爱典范&#xff0c;娱乐圈中的爱情佳话。虽…

2024年首个iOS AI病毒来了!偷人脸照片,转银行卡余额...

目录 这个病毒如何感染用户手机&#xff1f; 这个AI病毒有哪些危害特征&#xff1f; 2023年有个类似的病毒出现 银行和个人怎么防御AI病毒&#xff1f; 针对金融机构 针对个人用户 2024年2月15日&#xff0c;国外安全公司Group-IB宣布&#xff0c;发现一个名为“GoldPickaxe”的…

初谈软件工程(一)

我就读于兰州交通大学的软件工程专业。虽然在全国众多的985、211高校中&#xff0c;兰州交通大学可能并不显眼&#xff0c;似乎未能跻身这些所谓的“顶尖”行列就意味着不被认可。然而&#xff0c;在甘肃省的教育领域中&#xff0c;它无疑是一座璀璨的明珠&#xff0c;名列前茅…

Airflow【实践 01】Airflow官网+自测源代码举例(简化安装+官方及自测python代码)

Airflow官网自测源代码举例 1.准备1.1 安装1.2 查询DAG目录 2.官方3.自测4.总结 官方网站地址&#xff1a; https://airflow.apache.org/docs/apache-airflow/2.7.2/&#xff0c;本文是基于 2.7.2版本进行的说明。 1.准备 1.1 安装 上一篇的 Quick Start 有详细的安装过程&…

经营分析到底要做什么?

​做经营分析&#xff0c;不是只看数据这么简单&#xff0c;我们要从目标-分析-决策-预警&#xff0c;全流程实现。 基于数据中台底座&#xff0c;实现从制定战略目标到执行落地的数据应用闭环。主要从四个维度来做&#xff1a; 第一步&#xff0c;就是基于预算管理进行战略目…

【书籍分享 • 第三期】虚拟化与容器技术

文章目录 一、本书内容二、读者对象三、编辑推荐四、前言4.1 云计算技术的发展4.2 KVM、Docker4.3 本书内容简介4.4 作者简介 五、粉丝福利 一、本书内容 《虚拟化与容器技术》通过深入浅出的方式介绍KVM虚拟化技术与Docker容器技术的概念、原理及实现方法&#xff0c;内容包括…

图片录入设备、方式与质量对图片转Excel的影响

随着数字化时代的到来&#xff0c;图片已经成为人们日常生活中不可或缺的一部分。在各行各业中&#xff0c;图片的应用越发广泛&#xff0c;从而促使了图片处理技术的快速发展。然而&#xff0c;图片的质量对于后续数据处理和分析的准确性和可靠性有着至关重要的影响。本文将从…

Java设计模式 | 七大原则之依赖倒转原则

依赖倒转原则&#xff08;Dependence Inversion Principle&#xff09; 基本介绍 高层模块不应该依赖低层模块&#xff0c;二者都应该依赖其抽象&#xff08;接口/抽象类&#xff09;抽象不应该依赖细节&#xff0c;细节应该依赖抽象依赖倒转&#xff08;倒置&#xff09;的…

源聚达科技:新手做抖音店铺到底要多久回本

在数字化浪潮中&#xff0c;抖音店铺如雨后春笋般涌现。新手商家涉足其中&#xff0c;常怀揣一问&#xff1a;何时能够回本?此问题非一日可答&#xff0c;涉及因素众多&#xff0c;但透过分析与经验&#xff0c;仍可略窥端倪。 选品策略。若产品契合市场需求&#xff0c;且具备…

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

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

前端Vue项目无法启动服务,提示无 ‘dev‘ npm的脚本问题解决

目录 一、问题详情 二、问题解决 一、问题详情 上周还能运行的项目&#xff0c;今天突然无法执行了&#xff0c;连最基本的启动按钮也没有了&#xff0c;所有的项目本地都突然跑不起来了&#xff0c;附上截图。 二、问题解决 后来排查的根本原因有点奇葩&#xff0c;是因为…

如何保护企业免受人工智能网络钓鱼攻击

文章目录 前言一、生成式人工智能带来了新的网络安全威胁二、人工智能将使网络钓鱼攻击变得更加危险三、企业如何阻止人工智能驱动的网络钓鱼四、网络钓鱼模拟确保责任感和适应性前言 网络钓鱼是网络犯罪分子社会工程武器库中的超级武器。网络钓鱼尤其危险,因为它是网络犯罪分…

docker 容器内服务随容器自动启动

docker 容器内服务随容器自动启动 1. 背景2. 准备工作3. 方式一&#xff0c;直接修改.bashrc文件&#xff08;简单粗暴&#xff09;4. 方式二&#xff0c;编写启动脚本加入.bashrc文件&#xff08;文明一点&#xff09;5. 导出容器制作镜像6. 测试导出容器&#xff0c;nginx服务…

动态规划之第 N 个泰波那契数/三步问题【leetCode】【算法】

动态规划动态规划之第 N 个泰波那契数/三步问题 动态规划LeetCode题目第 N 个泰波那契数求解1求解2&#xff08;滚动数组&#xff09; 三步问题求解1求解2&#xff08;滚动数组&#xff09; 动态规划 如果问题是由重叠的子问题构成的&#xff0c;那就可以用动态规划&#xff08…

python Matplotlib Tkinter-->tab切换3

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox import …