Python算法题集_括号生成

news2024/11/16 20:50:23

Python算法题集_括号生成

  • 题22:括号生成
  • 1. 示例说明
  • 2. 题目解析
    • - 题意分解
    • - 优化思路
    • - 测量工具
  • 3. 代码展开
    • 1) 标准求解【堆栈回溯】
    • 2) 改进版一【切片回溯】
    • 3) 改进版二【列表缓存+逐层扩充】
  • 4. 最优算法
  • 5. 相关资源

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

题22:括号生成

1. 示例说明

  • 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

    示例 1:

    输入:n = 3
    输出:["((()))","(()())","(())()","()(())","()()()"]
    

    示例 2:

    输入:n = 1
    输出:["()"]
    

    提示:

    • 1 <= n <= 8

2. 题目解析

- 题意分解

  1. 本题是计算n对括号可能生成的字符串
  2. 标准解法为通过递归进行回溯求解
  3. 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。

- 优化思路

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

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

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

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

    1. 可以在回溯算法中使用堆栈方式,也可以使用切片方式

    2. 可以考虑存储过程值列表,逐步扩充到n对括号


- 测量工具

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

3. 代码展开

1) 标准求解【堆栈回溯】

使用列表作为缓存,使用pop实现回溯

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

import CheckFuncPerf as cfp

class Solution:
 def generateParenthesis_base(self, n):
     if n == 0:
         return []
     result, path = [], []
     def dfs_backtrack(left, right):
         if right > left or left > n or right > n:
             return
         if left == n and right == n:
             result.append("".join(path))
             return
         path.append("(")
         dfs_backtrack(left + 1, right)
         path.pop()
         path.append(")")
         dfs_backtrack(left, right + 1)
         path.pop()
     dfs_backtrack(0, 0)
     return result

aSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.generateParenthesis_base, ilen)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))

# 运行结果
函数 generateParenthesis_base 的运行时间为 8185.84 ms;内存使用量为 234904.00 KB 执行结果 = 2674440

2) 改进版一【切片回溯】

使用列表作为缓存,使用切片实现回溯

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

import CheckFuncPerf as cfp

class Solution:
 def generateParenthesis_ext1(self, n):
     if n == 0:
         return []
     self.result, self.track = [], ''
     def dfs_backtrack(left, right):
         if left > right:
             return
         if left < 0 or right < 0:
             return
         if left == 0 and right == 0:
             self.result.append(self.track)
             return
         self.track += '('
         dfs_backtrack(left - 1, right)
         self.track = self.track[:-1]
         self.track += ')'
         dfs_backtrack(left, right - 1)
         self.track = self.track[:-1]
     dfs_backtrack(n, n)
     return self.result

aSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.generateParenthesis_ext1, ilen)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))

# 运行结果
函数 generateParenthesis_ext1 的运行时间为 10389.33 ms;内存使用量为 236416.00 KB 执行结果 = 2674440

3) 改进版二【列表缓存+逐层扩充】

使用多维列表结构保存0-n对括号组合的组合列表,逐层扩充组合到n个

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

import CheckFuncPerf as cfp

class Solution:
 def generateParenthesis_ext2(self, n):
     if n == 0:
         return []
     map_results = []
     map_results.append([None])
     map_results.append(["()"])
     for iIdx in range(2, n+1):
         tmpResult = []
         for jIdx in range(iIdx):
             now_list1 = map_results[jIdx]
             now_list2 = map_results[iIdx-1-jIdx]
             for item1 in now_list1:
                 for item2 in now_list2:
                     if item1 == None:
                         item1 = ""
                     if item2 == None:
                         item2 = ""
                     tmpItem = "(" + item1 + ")" + item2
                     tmpResult.append(tmpItem)
         map_results.append(tmpResult)
     return map_results[n]

aSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.generateParenthesis_ext2, ilen)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))

# 运行结果
函数 generateParenthesis_ext2 的运行时间为 967.22 ms;内存使用量为 233628.00 KB 执行结果 = 2674440

4. 最优算法

根据本地日志分析,最优算法为第3种方式【列表缓存+逐层扩充】generateParenthesis_ext2

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

  1. 组合的回溯求解中,列表切片操作性能低于pop操作
  2. 递归为重型结构,如果能用非递归的算法直接实现,性能会好很多
ilen = 10
aSolution = Solution()
result = cfp.getTimeMemoryStr(aSolution.generateParenthesis_base, ilen)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))
result = cfp.getTimeMemoryStr(aSolution.generateParenthesis_ext1, ilen)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))
result = cfp.getTimeMemoryStr(aSolution.generateParenthesis_ext2, ilen)
print(result['msg'], '执行结果 = {}'.format(len(result['result'])))

# 算法本地速度实测比较
函数 generateParenthesis_base 的运行时间为 8185.84 ms;内存使用量为 234904.00 KB 执行结果 = 2674440
函数 generateParenthesis_ext1 的运行时间为 10389.33 ms;内存使用量为 236416.00 KB 执行结果 = 2674440
函数 generateParenthesis_ext2 的运行时间为 967.22 ms;内存使用量为 233628.00 KB 执行结果 = 2674440

5. 相关资源

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

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

may the odds be ever in your favor ~

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

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

相关文章

#单片机(TB6600驱动42步进电机)

1.IDE:keil 2.设备:保密 3.实验&#xff1a;使用单片机通过普通IO口控制TB6600驱动42步进电机 4.时序图&#xff1a; TB6600 ENA、ENA-DIR-、DIRPUL-、PULB-、BA、A-VCC、GND使能电机&#xff08;直接悬空不接&#xff09;方向脉冲输入&#xff08;普通IO口模拟即可&#xff…

回归啦!!!

消失的日子在实习&#xff0c;今天最后一天了来看看自己的学习日志&#xff0c;有没有可以和小伙伴交流的部分吧&#xff01; 目录 一、产品one ①简介 ②底层原理 ③知识点一 作用一&#xff1a;日志采集 作用二&#xff1a;实时监测 作用三&#xff1a;规则匹配 作用…

足底筋膜炎的症状及治疗

足底筋膜炎症状&#xff1a;足底筋膜炎通常表现为足跟部疼痛&#xff0c;尤其是在晨起或长时间站立、行走后加重。疼痛可能向足底前部或足弓处放射&#xff0c;严重时可能影响行走。此外&#xff0c;患者还可能出现足跟部肿胀、皮肤温度升高、局部压痛等症状。 足底筋膜炎治疗方…

WinForm、Wpf自动升级 AutoUpdater.NET

Github AutoUpdater.NET 目录 一、IIS部署 更新站点 二、创建Winform 一、IIS部署 更新站点 IIS默认站点目录下创建 目录 Downloads、Updates Updates目录创建文件 UpdateLog.html、AutoUpdaterStarter.xml UpdateLog.html&#xff1a; <html><body><h1…

FPGA开源项目分享——2D N-Body重力模拟器

​导语 今天继续康奈尔大学FPGA 课程ECE 5760的典型案例分享——2D N-Body重力模拟器。 &#xff08;更多其他案例请参考网站&#xff1a; Final Projects ECE 5760&#xff09; 1. 项目概述 项目网址 Grav Sim 项目说明 该项目的目标是创建一个用DE1-SOC进行硬件加速的2…

FPGA-VGA成像原理与时序

什么是VGA: VGA, Video Graphics Array。即视频图形阵列,具有分辨率高、显示速率快、颜色丰富等优点。VGA接口不但是CRT显示设备的标准接口,同样也是LCD液晶显示设备的标准接口,具有广泛的应用范围。在FGPA中,常广泛用于图像处理等领域。 VGA 显示器成像原理 在 VGA 标准刚兴…

YOLO算法改进Backbone系列之:PVTv2

摘要&#xff1a;最近&#xff0c;Transformer在计算机视觉方面取得了令人鼓舞的进展。在本研究中&#xff0c;本文通过增加(1)线性复杂度注意层、(2)重叠贴片嵌入和(3)卷积前馈网络三种设计&#xff0c;改进了原始的金字塔视觉转换器(PVT v1)&#xff0c;提出了新的基线。通过…

机器学习笔记 YOLOv9模型相关论文简读

一、YOLOv9简述 自 2015 年 Yolov1 推出以来,已经出现了多个版本。 基于Darknet的YOLOv2、YOLOv3和YOLOv4 YOLOv5 YOLOv8 基于 Ultralytics。 SCALED-YOLOv4 使用 Pytorch 而不是 Darknet。 YOLOR是YOLOv4的改进。 YOLOX是YOLOv3的改进。 YOLOv6专注于工业应用。 YOLOv7 来自 …

iOS消息转发流程

当向Objc对象发送消息时&#xff0c;如果找到对象对应的方法&#xff0c;就会进入消息转发流程&#xff0c;给开发者提供一些最后的机会处理消息无法发送问题&#xff0c;以免出现程序崩溃。 1. 回调对象的resolveInstanceMethod方法&#xff0c;在这个方法中&#xff0c;允许开…

【golang】go module依赖的git tag被覆盖 如何处理 | 因测试产生大量的git tag 如何清除 最佳实践

一、场景 当我们把本地和远程git仓库的 tag全部删除&#xff0c;我们另外的项目依赖于这个被删除tag无法更新版本 如何处理&#xff1f; 如上图&#xff1a; 这里我创建了一个 v0.0.1 的tag&#xff0c;然后删除了这个tag&#xff0c;然后又创建了一个新的 v0.0.1的tag&#xf…

【图论】【并集查找】【C++算法】928. 尽量减少恶意软件的传播 II

作者推荐 动态规划的时间复杂度优化 涉及知识点 图论 并集查找 LeetCode928. 尽量减少恶意软件的传播 II 给定一个由 n 个节点组成的网络&#xff0c;用 n x n 个邻接矩阵 graph 表示。在节点网络中&#xff0c;只有当 graph[i][j] 1 时&#xff0c;节点 i 能够直接连接到…

(每日持续更新)jdk api之PipedOutputStream基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

7. 构建简单 IPv6 网络

7.1 实验介绍 7.1.1 关于本实验 IPv6&#xff08;Internet Protocol Version 6&#xff09;也被称为IPng&#xff08;IP Next Generation&#xff09;。它是Internet工程任务组IETF&#xff08;Internet Engineering Task Force&#xff09;设计的一套规范&#xff0c;是IPv4…

Android minigbm框架普法

Android minigbm框架普法 引言 假设存在这么一个场景&#xff0c;我的GPU的上层实现走的不是标准的Mesa接口&#xff0c;且GPU也没有提专门配套的gralloc和hwcompoer实现。那么我们的Android要怎么使用到EGL和GLES库呢&#xff0c;并且此GPU驱动是支持drm实现的&#xff0c;也有…

Docker中使用Tomcat并部署war工程

系列文章目录 文章目录 系列文章目录前言一、构建镜像二、运行镜像三、列出正在运行的容器四、停止正在运行的容器 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文…

蓝桥杯Python B组练习——python复习2

蓝桥杯Python B组练习——python复习2 一、简介 复习python&#xff0c;参考书《Python编程从入门到实践》&#xff0c;[美]Eric Mathes著。前一部分见专栏——蓝桥杯Python B组练习 这一部分不全&#xff0c;不想写了 二、字典 1.一个简单的字典 来看一个游戏&#xff0…

Vue2:用node+express写一个轻量级的后端服务

1、桌面创建demo文件夹 进入demo&#xff0c;执行如下命令 npm init输入名称&#xff1a; test_server然后一路回车 2、安装express框架 npm i express3、新建server.js 在demo文件夹中&#xff0c;新建server.js const express require(express) const app express()…

系统集成Prometheus+Grafana

根据产品需求在自己的系统中添加一个系统监控的页面&#xff0c;其中有主机信息的显示&#xff0c;也有一些业务信息的显示。调研后的方案是 主机信息通过Prometheus采集和存储&#xff0c;业务信息通过自己系统的调度任务统计后存储在Mysql中&#xff0c;使用Grafana对接Prome…

LeetCode383. 赎金信(C++)

LeetCode383. 赎金信 题目链接代码 题目链接 https://leetcode.cn/problems/ransom-note/description/ 代码 class Solution { public:bool canConstruct(string ransomNote, string magazine) {int record[26] {0};if(ransomNote.size() > magazine.size()) return fa…

EasyRecovery2024国产免费的手机数据恢复软件

一、功能介绍 EasyRecovery手机数据恢复软件是一款功能全面的数据恢复工具&#xff0c;专为移动设备设计。其主要功能包括&#xff1a; 文件恢复&#xff1a;能够恢复手机中因各种原因丢失的文件&#xff0c;如照片、视频、音频、文档等。深度扫描&#xff1a;通过深度扫描手…