从零学算法22

22.数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]
示例 2:
输入:n = 1
输出:[“()”]

  • 观察会发现,有效的组合在生成时一定满足左括号多余等于右括号,否则比如 ()) 无论之后怎么加括号最后都是无效组合,生成的过程不难想到用回溯法,在每一位尝试放左括号或者右括号,在前一步的基础上继续各自递归尝试,很像二叉树遍历,基本上套用回溯模版即可
  • 回溯模板
  •   private void backtrack("原始参数") {//终止条件(递归必须要有终止条件)if ("终止条件") {//一些逻辑操作(可有可无,视情况而定)return;}for (int i = "for循环开始的参数"; i < "for循环结束的参数"; i++) {//一些逻辑操作(可有可无,视情况而定)//做出选择//递归backtrack("新的参数");//一些逻辑操作(可有可无,视情况而定)//撤销选择}}
    
  • 最终代码
  •   List<String> res = new ArrayList<>();public List<String> generateParenthesis(int n) {dfs(n, n, "");return res;}// left:能放的左括号数量,right 同理// str:当前生成的字符串public void dfs(int left, int right, String str){// 说明此时右括号数量多余左括号,直接舍弃if(left>right)return;// 左右括号都用完就记录该组合if(left==0 && right == 0){res.add(str);return;}// 左括号用完就继续加右括号,以下同理if(left==0)dfs(left,right-1,str+")");else if(right==0)dfs(left-1,right,str+"(");else{dfs(left-1,right,str+"(");dfs(left,right-1,str+")");}}
    
  • 他人题解:思路一致,代码更精简。实际上只要左括号还有,并且左括号数量大于等于左括号数量,就说明 right>=left>=0,那就可以直接递归,所以可以不分情况
  •   public void dfs(int left, int right, String str){// 左括号都用到负数了肯定不行了// 右括号更多必定无效组合// 并且如果通过了以下两个条件,就说明  right 也 >=0,所以不需要再判断 rightif(left<0 || left>right)return;if(left==0 && right == 0){res.add(str);return;}dfs(left-1,right,str+"(");dfs(left,right-1,str+")");}
    
  • 他人题解2:动态规划,从感觉上来说是感觉可以 dp 的,但是这个公式真不太好想。
  • 设 dp[i] 表示 n 等于 i 时生成的有效括号组合,递推公式为:dp[i] = "(" + dp[m] + ")" + dp[k], m + k = i-1 。具体写的时候,这里比较绕的就是 dp[i] 是一个 list,比如 dp[1] = ["()"]dp[2]=["()()", "(())"] ,所以即使知道知道动态规划方程, dp 部分还是比较难理解
  • dp[i] = "(" + dp[m] + ")" + dp[k] 的理解:这里的意思其实是 dp[m] 中每个组合和 dp[k] 中每个组合,结合成新的结果。比如 "(" + dp[m] + ")" + dp[k] 先简化理解成 dp[m]+dp[k] ,假设 dp[m]=[1,2], dp[k]=[3,4] ,那么其实得到结果应该为 [13,14,23,24] 所以核心部分如下:
  •   for (int m = 0; m < i; m++) {int k = i - 1 - m;List<String> str1 = dp[m];List<String> str2 = dp[k];for (String s1 : str1) {for (String s2 : str2) {cur.add("(" + s1 + ")" + s2);}}}
    
  • 边界条件为 dp[0]= "" ,所以最终代码如下
  •   public List<String> generateParenthesis(int n) {// 初始化 [[""]],不然 dp[i-1] 都没东西List<String>[] dp = new List[n + 1];List<String> dp0 = new ArrayList<>();dp0.add("");dp[0] = dp0;for (int i = 1; i <= n; i++) {// 记录 dp[i] 的组合List<String> cur = new ArrayList<>();for (int m = 0; m < i; m++) {int k = i - 1 - m;List<String> str1 = dp[m];List<String> str2 = dp[k];for (String s1 : str1) {for (String s2 : str2) {cur.add("(" + s1 + ")" + s2);}}}dp[i] = cur;}return dp[n];}
    
  • 他人题解2优化:上面 dp 的核心就在于 dp[m] 和 dp [k] 的组合,但是 dp[m] 其实不就是 generateParenthesis(m),所以可以优化如下
  •   public static List<String> generateParenthesis(int n) {List<String> list = new ArrayList<>();if (n == 0) {//边界条件的判断list.add("");return list;}for (int m = 0; m < n; m++) {int k = n - m - 1;List<String> first = generateParenthesis(m);List<String> second = generateParenthesis(k);for (String left : first) {for (String right : second) {list.add("(" + left + ")" + right);}}}return list;}
    

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

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

相关文章

Oracle19c锁表及解锁方法

首先查看数据库中哪些表被锁了&#xff0c;找到session ID&#xff1a; select alter system kill session ||sess.sid||,||sess.serial#||; from v$locked_object lo,dba_objects ao,v$session sess where ao.object_id lo.object_id and lo.session_id sess.sid;2&#xf…

移动通信原理与关键技术学习(4)

1.小尺度衰落 Small-Scale Fading 由于收到的信号是由通过不同的多径到达的信号的总和&#xff0c;接收信号的增强有一定的减小。 小尺度衰落的特点&#xff1a; 信号强度在很小的传播距离或时间间隔内的快速变化&#xff1b;不同多径信号多普勒频移引起的随机调频&#xff…

代码随想录算法训练营第15天 | 102. 二叉树的层序遍历 + 226. 翻转二叉树 + 101. 对称二叉树

今日内容 102.层序遍历 226.翻转二叉树 101.对称二叉树 102.二叉树的层序遍历 - Medium 题目链接&#xff1a;力扣-102. 二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&…

Matlab 之数据分布拟合

文章目录 Part.I IntroductionPart.II Distribution Fitter APP 的使用Chap.I APP 简介Chap.II 简单使用 Part.III 通过代码实现分布拟合Chap.I 基于 fitdist 函数Chap.II 获取数据的频率分布后进行曲线拟合 Reference Part.I Introduction 本文主要介绍了如何使用 Matlab 对数…

Xcalibur软件Qual Brower程序的使用

找到Qual Brower&#xff1a;在System>Program里 打开采集的数据文件*.RAW&#xff0c;软件界面主窗口能查看色谱图和质谱图&#xff1a; 1、图形的放大和拷贝、色谱中查看峰的质谱信息&#xff1a; 点亮如图图像右上角的按钮&#xff0c;可以激活该图形并进行操作&#x…

JavaScript日期和时间处理手册

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ ✨ 前言 日期和时间在应用开发中是非常常用的功能。本文将全面介绍JavaScript中处理日期和时间的方…

专业课128分总分400+南京理工大学818信号系统与数字电路南理工考研经验分享

专业课128分总分400南京理工大学818信号系统与数字电路南理工电光院考研经验分享&#xff0c;希望自己的经历对大家有借鉴。 我是在六月底确认自己保不上研然后专心备考的&#xff0c;时间确实比较紧张。虽然之前暑假看了一点高数&#xff0c;但因为抱有保研的期望&#xff0c…

电机PCB设计注意事项

电机PCB设计注意事项 电机的布局和布线以及相关的电气注意事项这里参考的是TI的文章&#xff0c;文章的链接如下&#xff1a; 电机驱动器电路板布局的最佳实践 布线时的注意 首先是布线的宽度: 大电流的布线经过我自己的测试&#xff0c;大概50mil-100mil左右&#xff0c;我…

SPI协议介绍

文章目录 一、硬件连线二、引脚含义三、传输示例四、传输模式 一、硬件连线 二、引脚含义 引脚含义DO&#xff08;MOSI - Master Output Slave Input&#xff09;主机发数据&#xff0c;从机收数据DI&#xff08;MISO - Master Input Slave Output&#xff09;主机收数据&…

HarmonyOS4.0系统性深入开发15Want概述

Want概述 Want的定义与用途 Want是对象间信息传递的载体&#xff0c;可以用于应用组件间的信息传递。其使用场景之一是作为startAbility()的参数&#xff0c;包含了指定的启动目标以及启动时需携带的相关数据&#xff0c;如bundleName和abilityName字段分别指明目标Ability所…

linux系统关于nginx服务

nginx服务 nginx服务nginx特点IO多路复用I/O multiplexing【多并发】epoll接收请求的过程异步&#xff0c;非阻塞 nginx 的内部技术架构 nginx服务 nginx特点 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c…

金和OA C6 upload_json 任意文件上传漏洞

产品介绍 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 漏洞概述 金和 OA C6 upload_json接口处存在任意文件上传漏洞&#xff0c;攻击者可以通过构造特殊请求包上…

LTESniffer:一款功能强大的LTE上下行链路安全监控工具

关于LTESniffer LTESniffer是一款功能强大的LTE上下行链路安全监控工具&#xff0c;该工具是一款针对LTE的安全开源工具。 该工具首先可以解码物理下行控制信道&#xff08;PDCCH&#xff09;并获取所有活动用户的下行链路控制信息&#xff08;DCI&#xff09;和无线网络临时…

三分钟教你学会设置PICO不自动休眠

三分钟教你学会设置PICO不自动休眠 大家经常会有这种困扰吧&#xff0c;“诶&#xff0c;我去倒杯水&#xff0c;怎么屏幕就黑了”或者“啊这个活动怎么要在线看这么久&#xff0c;好想去玩手机”之类的。会出现这种问题是因为PICO将自动休眠的时间设置得非常短&#xff0c;大…

Flink-CEP 实战教程

文章目录 1. 基本概念1.1 CEP 是什么1.2 模式&#xff08;Pattern&#xff09;1.3 应用场景 2. 快速上手2.1 引入依赖2.2 入门实例 3. 模式API&#xff08;Pattern API&#xff09;3.1 个体模式3.1.1 基本形式3.1.2 量词&#xff08;Quantifiers &#xff09;3.1.3 条件&#x…

GBASE南大通用分析型MPP数据库GBase8a的安全特性(2)

GBase南大通用自主研发的 GBase 8a MPP Cluster 产品&#xff08;简称GBase8a)是大数据时代成熟的分析型MPP数据库&#xff0c;具有多样化的平台选择、与时俱进的逻辑架构、海量数据高效存储、海量数据高速加载、海量数据高性能分析、弹性服务器资源伸缩、完善的系统资源管理、…

Ubuntu18.04 Qt 实现MQTT

什么是MQTT&#xff1f; 作用是什么&#xff08;适用场景&#xff09;&#xff1f; 与其他通讯协议相比&#xff0c;优缺点在那里&#xff1f; 一.实现 MQTT 服务器 使用 EMQ X&#xff08;开源且可视化管理&#xff09; 下载 EMQX 下载的是 emqx-5.0.26-ubuntu18.04-…

AI Agent落地先行者实在智能:2023人工智能领军者、百强、TOP30揭榜

实在智能连登三榜&#xff01; 【2023年十佳人工智能行业领军人物】 【2023年度人工智能领域创新企业】 【2023年度最具投资价值企业】 喜大普奔&#xff01;近期&#xff0c;国内科技行业颇具含金量的三张榜单接连发布&#xff0c;实在智能皆榜上有名&#xff0c;“2023「…

网络编程套接字(Socket)

文章目录 1 重点知识2 预备知识2.1 理解源IP地址和目的IP地址2.2 认识端口号2.3 理解 "端口号" 和 "进程ID"2.4 理解源端口号和目的端口号2.5 认识TCP协议2.6 认识UDP协议2.7 网络字节序 3 socket编程接口3.1 socket 常见API3.2 sockaddr结构 4 简单的UDP网…

RT-Thread基于AT32单片机的485应用开发(三)Modbus从机

RT-Thread中已经有不少Modbus相关在线软件包&#xff0c;但总体应用起来还是相对复杂&#xff0c;所以在RT-Thread基于AT32单片机的485应用开发&#xff08;二&#xff09;的基础上实现了一个极简Modbus从机&#xff0c;支持Modbus功能码01&#xff0c;02&#xff0c;03&#x…