Python面试宝典第25题:括号生成

题目

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

        备注:1 <= n <= 8。

        示例 1:

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

        示例 2:

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

递归法

        使用递归法求解此问题的基本思想是:将生成有效括号序列的问题分解为更小的子问题。对于每一对括号,我们都可以看作是在已有的有效括号序列基础上,或者在其前后分别添加一个左括号和右括号。为了保证序列的有效性,我们需要确保任何时候左括号的数量都不少于右括号的数量。因此,可以采用递归的方式,逐步构建所有可能的序列。使用递归法求解本题的主要步骤如下。

        1、定义递归函数。函数接受两个参数,left 表示还可以使用的左括号数量,right 表示还可以使用的右括号数量,以及当前已经构造的括号序列curr_str。

        2、递归终止条件。当left和right都为0时,说明当前序列是一个有效的括号组合,将其加入结果列表。

        3、递归生成左括号。如果还有左括号可用(left > 0),则在当前序列后添加一个左括号,然后递归调用自身,减小left的计数。

        4、递归生成右括号。如果右括号的数量少于等于左括号(right <= left),则不能添加右括号,因为这会导致序列无效。否则,在当前序列后添加一个右括号,然后递归调用自身,减小right的计数。

        5、回溯。在每次递归调用返回后,撤销之前的选择,即回到上一层继续尝试其他可能性。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def generate_brackets_by_recursion(n):def backtrack(left, right, curr_str, result):if left == 0 and right == 0:result.append(curr_str)returnif left > 0:backtrack(left - 1, right, curr_str + '(', result)if right > left:backtrack(left, right - 1, curr_str + ')', result)result = []backtrack(n, n, '', result)return resultprint(generate_brackets_by_recursion(3))
print(generate_brackets_by_recursion(1))

总结

        递归法求解本题的时间复杂度主要取决于生成的括号组合的数量。对于n对括号,有效的括号组合数量遵循卡特兰数,其公式为C_n = (1/(n+1)) * (2n choose n)。卡特兰数的增长速度非常快,大约是 4^n / (sqrt(pi*n)*n^(3/2))。因此,时间复杂度为 O(C_n),即:O(4^n / sqrt(n))。空间复杂度主要由递归栈的深度决定,最坏情况下,递归栈的深度为2n,故空间复杂度为O(n)。

        递归法特别适合括号生成类问题,因为它能自然地表达出问题的结构,即通过逐步构建解的空间树来寻找所有可能的解。然而,当n接近上限(比如:n=8)时,生成的组合数量会非常庞大,这可能会对程序的执行时间和内存使用提出较高的要求。因此,在实际应用中需要考虑递归的深度和效率问题。

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

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

相关文章

【ArcGIS+CityEngine】自行制作Lod1城市大尺度白膜数据

数据准备 50多个城市建筑矢量数据 链接&#xff1a;https://pan.baidu.com/s/1FiwTfXDwQ6tMDRACAwUZwQ 提取码&#xff1a;DYSK 数据分析 数据属性Floor&#xff0c;为建筑物楼层信息&#xff0c;据此信息下面将在CityEngine软件生成Lod1白膜数据。 软件准备 CityEngi…

创建了Vue项目,需要导入什么插件以及怎么导入

如果你不知道怎么创建Vue项目,建议可以看一看这篇文章 怎么安装Vue的环境和搭建Vue的项目-CSDN博客 1.在idea中打开目标文件 2.系在一个插件Vue.js 3.下载ELement UI 在Terminal中输入 # 切换到项目根目录 cd vueadmin-vue # 或者直接在idea中执行下面命令 # 安装element-u…

[GYCTF2020]Blacklist1

打开题目 判断注入类型&#xff0c;输入1试试 输入2 输入1 判断为字符型注入 堆叠查询2;show databases;# 然后来输入2; show tables;#来查看数据库的表 然后我们通过FlagHere表来查看列输入2;show columns from FlagHere;# 来查看列 、 重新构造payload&#xff1a;0;HAND…

基于FPGA的高精度多通道同步AD采集系统开发及数字信号处理算法应用,基于FPGA的多通道同步AD采集系统开发及数字信号处理算法实现

FPGA多通道同步AD采集 AD7606 8通道16位高精度同步采集系统开发&#xff0c;采样率200KSPS&#xff0c;采集数据支持DDR3缓存、串口发送、USB2.0上传、千兆以太网上传等。 支持基于FPGA的数字信号处理算法开发 ID:77500703611886617 塞纳河山 FPGA多通道同步AD采集是一项基于…

官宣!新增博士硕士点审核结果已出!附查询方法

2024年7月31日&#xff0c;新增博士硕士学位授权结果正式公示&#xff01; 多所高校&#xff0c;新增博士和硕士学位授权点 大家可前往该网站查询&#xff1a;https://zjpy.cdgdc.edu.cn/sqshjggb 另外说明一下&#xff0c;这些学校不一定今年就开展招生工作 一切以学校的官…

9.Redis的Set类型

Redis的Set结构与java中的HashSet类似。 可以看做是一个value为null的HashMap。 特点 1.无序 2.元素不可重复 3.查找快 4.支持交集、并集、差集等功能 应用场景 实现共同关注&#xff0c;共同好友。 常见命令 sadd key 元素1 元素2 给set集合添加一个或多个元素 smem…

Kimi+AiPPT的正确打开方式!文档一键转换PPT!限时免费!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之路不迷路,2024我们一起变强。 我之前…

做管理,一定要避开这6个坑,才能成就优秀管理者

做管理&#xff0c;一定要避开这6个坑&#xff0c;才能成就优秀管理者 一、被平庸的员工绑架 要是领导不敢或者不愿意惩罚或者开除那些没完成任务的员工&#xff0c;那优秀的员工就会觉得&#xff0c;做得好做得差都一样&#xff0c;那谁还愿意努力呢&#xff1f; 二、总想改变…

基于双PI控制器结构的六步逆变器供电无刷直流电机调速simulink仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 无刷直流电机&#xff08;BLDCM&#xff09;原理 4.2 六步换相逆变器 4.3 双PI控制器设计 5.完整工程文件 1.课题概述 基于双PI控制器结构的六步逆变器供电无刷直流电机调速simulink仿真。双PI控制…

DockerCompose部署示例

目录 前言 1. 初识DockerCompose 2. 安装DockerCompose 3. 部署微服务项目 1&#xff09;找一个目录&#xff0c;创建一个新的cloud-demo文件夹。 2&#xff09;在cloud-demo文件夹创建一个docker-compose.yml文件&#xff0c;然后编写下面内容&#xff1a; 3&#xff09…

【视频讲解】后端增删改查接口有什么用?

B站视频地址 B站视频地址 前言 “后端增删改查接口有什么用”&#xff0c;其实这句话可以拆解为下面3个问题。 接口是什么意思&#xff1f;后端接口是什么意思&#xff1f;后端接口中的增删改查接口有什么用&#xff1f; 1、接口 概念&#xff1a;接口的概念在不同的领域中…

R语言统计分析——自编函数

参考资料&#xff1a;R语言统计分析【第2版】 一个函数的结构大致如此&#xff1a; myfunction<-function(arg1,arg2,...){ statements return(object) } 函数中的对象只在函数内部使用。返回对象的数据类型是任意的。 假设我们要编写一个函数&#xff0c;用来计算数据对象…

2、postgresql运行架构

2 运行架构 以为编译安装为模板讲解各个文件功能作用&#xff0c;切换为postgres用户 目录位置数据库数据目录/pgdata/10/data安装包目录/opt/pg10/ 2.1 安装包目录详解 -bash-4.2$ pwd /opt/pg10 -bash-4.2$ tree -L 1 . . ├── bin #应用程序 ├── include #c/c…

Debian12 安装Docker 用 Docker Compose 部署WordPress

服务器准备&#xff1a; 以root账号登录&#xff0c;如果不是root&#xff0c;后面指令需要加sudo apt update apt install apt-transport-https ca-certificates curl gnupg lsb-release添加GPG密钥&#xff0c;推荐国内源 curl -fsSL https://mirrors.aliyun.com/docker…

c语言指针中“数组名的理解”以及“一维数组传参”的本质

数组名的理解 数组名就是数组首元素的地址。 例如&#xff1a;输入一个数组的所有元素&#xff0c;再打印出来。 另一种写法 以上可以看出&#xff1a;*arri&#xff09; arr[i] 也即是&#xff1a;*(iarr)i[arr] 本质上无区别 1&#xff1a;数组就是数组&#xff0c;是一块…

DirectX修复工具下载安装指南:电脑dll修复拿下!6种dll缺失修复方法!

在日常使用电脑的过程中&#xff0c;不少用户可能会遇到“DLL文件缺失”的错误提示&#xff0c;这类问题往往导致程序无法正常运行或系统出现不稳定现象。幸运的是&#xff0c;DirectX修复工具作为一款功能强大的系统维护软件&#xff0c;能够有效解决大多数DLL文件缺失问题&am…

8.Redis的List类型

Redis中的list跟java中的LinkedList比较相似&#xff0c;可以看做是一个双向链表的结构。 既可以支持正向检索和反向检索。 特点 1.有序 2.元素可以重复 3.插入和删除快 4.查询速度一般 应用场景 点赞和评论功能&#xff0c;都会存在一个顺序&#xff0c;谁先评论&…

从入门到自动化:一篇文章掌握Python的80%

Python作为一种高级编程语言&#xff0c;以其简洁明了的语法和强大的功能性&#xff0c;在全球编程社区内享有极高的声誉。本文将带领你从Python的基础语法入手&#xff0c;介绍其常用库的应用&#xff0c;以及如何将Python用于数据分析、网络爬虫和简单的自动化任务&#xff0…

写一个图片裁剪的js,JavaScript图片裁剪插件PlusCropper

在前端开发中&#xff0c;图片裁剪是一个常见的需求。本文将深入解析一个功能完善的JavaScript图片裁剪插件——PlusCropper&#xff0c;带你一步步了解其实现原理和使用方法。 一、插件概述 PlusCropper是一个轻量级的JavaScript插件&#xff0c;它允许用户在网页上交互式地…

报表系统之Cube.js

Cube.js 是一个开源的分析框架&#xff0c;专为构建数据应用和分析工具而设计。它的主要目的是简化和加速构建复杂的分析和数据可视化应用。以下是对 Cube.js 的详细介绍&#xff1a; 核心功能和特点 1. 多数据源支持 Cube.js 支持从多个数据源中提取数据&#xff0c;包括 SQ…