python-leetcode 48.括号生成

题目:

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


方法一:回溯

可以生成所有 2**2n 个 ‘(’ 和 ‘)’ 字符构成的序列,然后检查每一个是否有效即可

为了生成所有序列,我们可以使用递归。长度为 n 的序列就是在长度为 n−1 的序列前加一个 ‘(’ 或 ‘)’。

为了检查序列是否有效,遍历这个序列,并使用一个变量 balance 表示左括号的数量减去右括号的数量。如果在遍历过程中 balance 的值小于零,或者结束时 balance 的值不为零,那么该序列就是无效的,否则它是有效的。

可以只在序列仍然保持有效时才添加 ‘(’ 或 ‘)’,通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,如果左括号数量不大于 n,我们可以放一个左括号。如果右括号数量小于左括号的数量,我们可以放一个右括号。

class Solution(object):def generateParenthesis(self, n):""":type n: int:rtype: List[str]"""ans=[] #列表,用于存储所有有效的括号组合def backtrack(S,left,right):  #递归回溯函数,当前构造的括号序列,当前左括号的数目,当前右括号的数目if len(S)==2*n:  #长度达到合法括号的序列ans.append(''.join(S))#列表 S 变成字符串,加入列表中returnif left<n:  #当左括号数目不达标时S.append("(")backtrack(S,left+1,right)  #加入左括号后继续构造S.pop()#递归返回后,将最后添加的 ( 移除,恢复原状(回溯)if right<left:  #只有 right < left 时,才能添加 ),确保括号序列合法S.append(")") #加了一个 ) 之后继续尝试构造backtrack(S,left,right+1)S.pop() # 将最后添加的 ) 移除,恢复原状backtrack([],0,0)return ans

时间复杂度:O(​4*n/n**1/2​),在回溯过程中,每个答案需要 O(n) 的时间复制到答案数组中

空间复杂度:O(n)


方法二:按括号序列的长度递归

任何一个括号序列都一定是由 ‘(’ 开头,并且第一个 ‘(’ 一定有一个唯一与之对应的 ‘)’,每一个括号序列可以用 (a)b 来表示,其中 a 与 b 分别是一个合法的括号序列(可以为空)。

生成所有长度为 2n 的括号序列,我们定义一个函数 generate(n) 来返回所有可能的括号序列。那么在函数 generate(n) 的过程中:

需要枚举与第一个 ‘(’ 对应的 ‘)’ 的位置 2i+1

递归调用 generate(i) 即可计算 a 的所有可能性

递归调用 generate(n−i−1) 即可计算 b 的所有可能性

遍历 a 与 b 的所有可能性并拼接,即可得到所有长度为 2n 的括号序列

为了节省计算时间,在每次 generate(i) 函数返回之前,把返回值存储起来,下次再调

用 generate(i) 时可以直接返回,不需要再递归计算

class Solution(object):def generateParenthesis(self, n):""":type n: int:rtype: List[str]"""if n==0:  #没有括号对return [""]ans=[]for c in range(n): #让c在0到n-1之间遍历,表示把 n 对括号分成两部分,左部分:c 对括号;右部分n - 1 - c 对括号for left in self.generateParenthesis(c):#递归调用自己,求出 c 对括号的所有可能组合,并把结果赋值给 left,相当于生成左部分括号的所有可能情况for right in self.generateParenthesis(n - 1 - c):#生成右部分括号的所有可能情况ans.append('({}){}'.format(left,right)) #负责把 left 和 right 组合return ans

时间复杂度:O(​4*n/n**1/2​)

空间复杂度:O(​4*n/n**1/2​)此方法除答案数组外,中间过程中会存储与答案数组同样数量级的临时数组,是所需要的空间复杂度。

源自力扣官方题解

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

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

相关文章

TDE透明加密技术:免改造实现华为云ECS中数据库和文件加密存储

在数字经济与云计算深度融合的今天&#xff0c;华为云ECS&#xff08;弹性云服务器&#xff09;已成为企业数字化转型的核心载体&#xff0c;承载着数据库、文件存储、AI训练等关键业务。然而&#xff0c;云上数据安全形势日益严峻&#xff1a;2024年全球云环境勒索攻击同比激增…

3D点云数据处理中的聚类算法总结

1.欧式聚类&#xff1a; 基于点的空间距离&#xff08;欧几里得距离&#xff09;来分割点云&#xff0c;将距离较近的点归为同一簇。 欧式聚类需要的参数&#xff1a;邻域半径R,簇的最小点阈值minPts&#xff0c;最大点数阈值maxPts。 实现效率&#xff1a; O(n * log n) 实现…

PCL--点云可视化

用于单个显示、多个显示的头文件<visual_.h> visual_.h #pragma once #include <iostream> #include <thread> #include <pcl/visualization/pcl_visualizer.h>using namespace std::chrono_literals;/********************************************…

火星探测发展概述2025.3.20

一.火星探测历程 1.1 探索启蒙 火星探测的启蒙阶段可追溯至20世纪60年代,标志着人类对这颗神秘行星的科学探索正式拉开帷幕。这一时期的标志性事件包括: 1960年10月至1964年11月间,苏联和美国进行了6次火星探测尝试,但均以失败告终。 1964年11月28日,美国成功发射“水手…

DAPO:一个开源的大规模大型语言模型LLM强化学习系统

推断扩展赋予了大型语言模型前所未有的推理能力,强化学习作为激发复杂推理的核心技术,清华大学联合字节提出了解耦片段与动态采样策略优化(DAPO)算法,并全面开源了一个最先进的大规模强化学习系统,该系统使用Qwen2.5-32B基础模型在AIME 2024上取得了50分的高分。还开源了…

力扣刷题46. 全排列

46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 使用dfs搜索&#xff0c;查找所有的情况&#xff0c;首先定义所有的链表集合list&#xff0c;在定义每一种情况的链表res&#xff0c;在主函数中遍历所有的初始元素&#xff0c;首先初始化res&#xff0c;并且添加到res中&…

Metasploit Framework(MSF)使用教程与命令详解

Metasploit Framework&#xff08;简称MSF&#xff09;是一款功能强大的开源渗透测试工具&#xff0c;广泛应用于网络安全领域。它集成了大量的漏洞利用模块&#xff08;exploits&#xff09;、辅助模块&#xff08;auxiliary&#xff09;和载荷&#xff08;payloads&#xff0…

【Netty】客户端功能完善

超时控制 public class RequestTimeoutManager {private final HashedWheelTimer timer new HashedWheelTimer();private final ConcurrentMap<Long, Timeout> pendingRequests new ConcurrentHashMap<>();public void addRequest(long requestId, long timeout…

【鸿蒙开发】Hi3861学习笔记- DS18B20温度传感器

00. 目录 文章目录 00. 目录01. DS18B20简介02. DS18B20引脚及电路03. DS18B20内部结构框图04. DS18B20内存映射05. 硬件设计06. 软件设计07. 实验现象08. 附录 01. DS18B20简介 DS18B20 是常用的数字温度传感器&#xff0c;其输出的是数字信号&#xff0c;具有体积小&#xf…

跨境大文件传输如何突破延迟与丢包双重困局

一、行业痛点&#xff1a;跨国传输的挑战 在全球化业务场景中&#xff0c;跨境大文件传输常面临网络延迟高、丢包率频发等问题。传统TCP协议因其“先建联再传输”的机制&#xff0c;在高时延、高丢包环境下效率骤降&#xff0c;导致跨国协作、影视渲染、科研数据共享等场景中传…

uni-app——计时器和界面交互API

API 基本概要 概念说明 API&#xff08;应用程序接口&#xff09;是预先定义的方法集合&#xff0c;用于实现特定功能。在 uni-app 中&#xff0c;通过全局对象 uni 调用 API&#xff0c;例如 uni.getSystemInfoSync 获取设备信息。 API 分类与调用规则 事件监听型 以 on 开…

Dify 升级攻略:从0.15.3迈向1.1.0,元数据管理全攻略!

嘿&#xff0c;小伙伴们&#xff01;今天给大家带来一个超实用的干货分享——Dify从0.15.3升级到1.1.0版本的详细攻略。这次升级不仅带来了功能上的更新&#xff0c;还特别强化了元数据管理。相信很多小伙伴和我一样&#xff0c;一直在使用Dify来提升工作效率&#xff0c;但每次…

15.三数之和-力扣(python)

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1&a…

numpy学习笔记14:模拟随机游走过程

numpy学习笔记14&#xff1a;模拟随机游走过程 随机游走是一种数学统计模型&#xff0c;其中的每一步方向和大小都是随机的。下面使用 NumPy 模拟一维和二维的随机游走过程&#xff1a; 1.代码示例 import numpy as np import matplotlib.pyplot as plt plt.rcParams[font.s…

YOLOv11 目标检测

本文章不再赘述anaconda的下载以及虚拟环境的配置&#xff0c;博主使用的python版本为3.8 1.获取YOLOv11的源工程文件 链接&#xff1a;GitHub - ultralytics/ultralytics: Ultralytics YOLO11 &#x1f680; 直接下载解压 2.需要自己准备的文件 文件结构如下&#xff1a;红…

dijkstra算法——47. 参加科学大会

卡码网:47. 参加科学大会https://kamacoder.com/problempage.php?pid=1047 题目描述 小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。 小明的起点是第一个车站,终点是最后一个车站。然而,途中的各个车站之间的道路状况、交通拥堵程度以…

Rust语言介绍和猜数字游戏的实现

文章目录 Rust语言介绍和猜数字游戏的实现cargo是什么使用Rust编写猜数字 Rust语言介绍和猜数字游戏的实现 Rust语言是一种系统编程语言&#xff0c;核心强调安全性、并发性以及高性能&#xff0c;由类似于C/C的底层控制能力&#xff0c;性能也非常接近&#xff0c;Rust有一些…

Ubuntu下Docker部署Misskey:打造你的去中心化社交平台

引言 在信息爆炸的时代&#xff0c;人们对于社交平台的需求日益增长&#xff0c;同时也更加注重数据的隐私和自由。Misskey作为一个开源的去中心化社交平台&#xff0c;为用户提供了一个全新的选择。本文将详细介绍如何在Ubuntu Linux环境下&#xff0c;利用Docker快速部署Mis…

DeepSeek Chat 自动化交互技术分析

本文将对 DeepSeek Chat 自动化交互脚本进行技术分析&#xff0c;包括代码结构、实现原理以及关键技术点。该脚本使用 Selenium 实现了对 DeepSeek Chat 平台的自动化登录和问答功能。 1. 代码结构概览 该脚本主要由以下几个部分组成&#xff1a; 环境准备与依赖导入&#x…

128. Longest Consecutive Sequence

如果n-1存在于数组中&#xff0c;则以n开头的连续序列可以忽略掉&#xff0c;因为以n-1开头的连续序列的长度肯定至少比以n开头的连续序列长1个元素。这是本题的关键。然后利用哈希表查询元素是否在数组中。 class Solution { public:int longestConsecutive(vector<int>…