编写一个能够排序的函数模板。_LeetCode刷题——9.给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合...

难度(medium)

题目描述:

给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。例如n=3,解集为:  "((()))", "(()())", "(())()", "()(())", "()()()"  思路:

和上一道题目有点类似,但是本题可以出现(())()的组合形式,上一道题目不能是这种形式。

也就是说所有合法的括号组合不仅仅是对称形式了,也存在非对称形式的情况。所以用栈的思路就行不通。

但是可以观察到,一个合法的组合,所有左括号出现的次数L=右括号出现的次数R,并且组合的长度=2*n。

所以可以拟合一个合法组合的生成过程,来进行算法的设计。

首先可以定义一个空的字符数组s,用于字符的添加,并将左括号出现的次数设为L,右括号出现的次数设为R。

那么第一次添加到括号必然是左括号‘(’,因为添加右括号不合法。因为是有多种组合,所以当左括号‘(’出现次数L小于n时,都可以一直添加,并且每添加1次,左括号出现的次数L+1,这样看来,算法设计上就适合采用递归形式。如下所示:

if(L < n){    bracketArrange(n,L+1,R,s);}

(关于L < n: 因为不可能一直添加左括号,合法组合还需要右括号搭配,比如3对括号,你最多单个左括号或者=单个右括号只有3个,所以L<3,为什么不能等于3呢,因为如果if(L<=3)那么当L=3的时候仍然可以进入if语句,那么下一次L+1后,L=4就大于单个左括号的临界值,所以不能等于3)

同理,当左括号添加完过后,就可以添加右括号了,添加的条件肯定是先有左括号的存在,并且左括号的个数L要大于右括号的次数R(设想,当你左括号2个右括号3个了,(())) 、())()....肯定不合法的,其次右括号个数还要小于n,上面已经说了原因。那么递归形式:

if(R < L && R < n){  bracketArrange(n,L,R+1,s)}

当左右括号添加完毕后,找一个list存储,那么此时整个字符组合的长度=2*n,并且结束递归,这样这个条件便是递归出口:

if(s.length() == 2 * n){  list.add(s);    return;}

讲道理,整个代码部分,return才是最巧妙灵性的设计,有了return,才有了这么多不重复的合法组合。因为第一种组合走完,return会返回到上一个递归,上一个递归又会返回给上上个递归,然后在条件合适的if语句下面做第二次组合。这里不是很好表述,需要自己debug跑一下,就大概清楚了。

7e60fd57cc3ca84c40ff33843c0a6ec5.gif

代码:

import java.util.ArrayList;public class myBracketArrange {    static ArrayListlist = new ArrayList<>();    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        int n = in.nextInt();        bracketArrange(n,0,0,"");        for (int i = 0; i < list.size(); i++) {            System.out.print(list.get(i));            System.out.println("\t");        }    }    public static void bracketArrange(int n, int l, int r, String s){        if (l < n){            bracketArrange(n,l+1, r, s + '(');        }        if (r < l && r < n){            bracketArrange(n, l,r+1,s + ')');        }        if(s.length() == 2*n){            list.add(s);            return;        }    }}

1396d974a7c57c256b3bb355139d5b91.gif

想写点其他东西了...

再看吧。

封面和配图来自于网络,侵删

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

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

相关文章

html5怎么产生手风琴效果,Html5 js如何实现手风琴效果

Html5 js如何实现手风琴效果发布时间&#xff1a;2020-08-03 09:54:10来源&#xff1a;亿速云阅读&#xff1a;92作者&#xff1a;小猪这篇文章主要为大家展示了Html5 js如何实现手风琴效果&#xff0c;内容简而易懂&#xff0c;希望大家可以学习一下&#xff0c;学习完之后肯定…

c++进制转换_一文了解进制之间的原理和转换

点击这段文字&#xff1a; 获取2020年&#xff0c;最强Python学习资料进制这块&#xff0c;可以做简单的了解。生活中我们使用的数字都是十进制的&#xff0c;而二进制是机器能够识别的最直接的语言。但是二进制又太大&#xff0c;记录起来非常的不方便。所以通常会将二进制转化…

用HTML做一个简单的web登录页面,简单的JavaWeb注册登录案例

简单的JavaWeb注册登录案例1.注册页面register.htmlregister姓名&#xff1a;电话&#xff1a;邮箱&#xff1a;qq&#xff1a;2.注册案例实现程序register.java/*** 注册案例实现程序* author lucky**/public class register extends HttpServlet {public void doGet(HttpServ…

一层循环时间复杂度_算法的时间与空间复杂度(一看就懂)

算法&#xff08;Algorithm&#xff09;是指用来操作数据、解决程序问题的一组方法。对于同一个问题&#xff0c;使用不同的算法&#xff0c;也许最终得到的结果是一样的&#xff0c;但在过程中消耗的资源和时间却会有很大的区别。那么我们应该如何去衡量不同算法之间的优劣呢&…

用ajax替换html代码,替换Ajax响应一个div的内部HTML(Replace inner HTML of a div w

我试图一些时间间隔后改变一个div的内部HTML。 我得到我想要使用Ajax正确的反应。 但无法取代内HTML的后&#xff0c;并用Ajax响应地选择。 什么是错我的代码..HTML51 seconds ago58 seconds ago.....10 minute agoĴ查询setInterval(function() {$( ".time" ).each(…

java 审批流_一文读懂工作流

网上关于工作流引擎有比较多的简介&#xff0c;也有很多工作流的实际应用场景。本文结合笔者多年对工作流的经验来阐述一下对工作流的理解。一、什么是工作流&#xff1f;先贴上wiki百科对于工作流的定义工作流&#xff08;Workflow&#xff09;&#xff0c;是对工作流程及其各…

postgresql 查询序列_时间序列数据库(TSDB)初识与选择

作者&#xff1a;码哥字节 如需转载联系我的公众号背景 这两年互联网行业掀着一股新风&#xff0c;总是听着各种高大上的新名词。大数据、人工智能、物联网、机器学习、商业智能、智能预警啊等等。以前的系统&#xff0c;做数据可视化&#xff0c;信息管理&#xff0c;流程控制…

concurrenthashmap实现原理_Mybatis:PageHelper分页插件源码及原理剖析

PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件&#xff0c;其实我并不想加上好用两个字&#xff0c;但是为了表扬插件作者开源免费的崇高精神&#xff0c;我毫不犹豫的加上了好用一词作为赞美。原本以为分页插件&#xff0c;应该是很简单的&#xff0c;然而PageH…

计算机网络dst,计算机网络基础课程—Socket接口

什么是TCP/IP------本课程的主要部分TCP/IP如何工作-----TCP/IP软件结构与实现如何用TCP/IP-------TCP/IP应用程序编程接口前面说过&#xff0c;TCP/IP标准并不指定应用程序与TCP/IP协议软件的接口&#xff0c;但并不是说没有提供任何指导&#xff0c;首先&#xff0c;它指定了…

python输入圆的半径公式_[图文]铁路曲线正矢的计算公式

一、圆曲线正矢的计算1.1 圆曲线正矢的计算公式取圆曲线上两点拉一直线,叫做弦。弦上任意点至曲线上的垂直距离叫矢或叫矢距。在弦中央点的矢距叫正矢(下图)。AB一弦;AC、CB一半弦;CD一正矢;EF一矢距正矢计算公式为其中: f-正矢 C-弦长 R-半径 式中单位均为m。公式用文字表示即…

docker 安装nacos_康过来!Nacos配置和管理微服务的使用

Nacos 具有如下特性:服务发现和服务健康监测&#xff1a;支持基于DNS和基于RPC的服务发现&#xff0c;支持对服务的实时的健康检查&#xff0c;阻止向不健康的主机或服务实例发送请求&#xff1b;动态配置服务&#xff1a;动态配置服务可以让您以中心化、外部化和动态化的方式管…

matlab中如何调用gpu进行并行计算_极致安卓-Termux/Aid learning开启WebGL手机GPU并行计算...

在我的之前的测评中&#xff0c;我利用Termux和Aid Learning测试过基于C/C的openmp并行程序&#xff0c;基于Java的并行程序&#xff0c;还有基于MPI以及基于Java的分布式集群并行。但是很遗憾&#xff0c;一直无法成功开发基于OpenCL的GPU并行编程。这是主要是因为Android并没…

python默认编码方式_关于设置python默认编码方式的问题

2019-8-27 07:45:36 本帖最后由 傻纸 于 2019-8-27 10:02 编辑 查了一会资料得出的结论是如果你用的是python3.x&#xff0c;那么就最好别去设置sys.defaultencoding或者sys.stdout.encoding 记住在需要编码的时候用encode&#xff0c;解码的时候decode就可以了。。。 这个问题…

计算机科学与技术是属于什么学科,计算机科学与技术专业属于什么大类 属于哪个学科...

近日&#xff0c;有很多人咨询小编计算机科学与技术专业属于什么大类 属于哪个学科&#xff1f;现在小编统一回复一下大家计算机科学与技术专业属于工学类&#xff0c;下面是关于计算机科学与技术专业详细的介绍。1计算机科学与技术专业门类及学科介绍专业名称专业代码门类学科…

matlab imread_MATLAB图像处理:29:在几何变换输出中指定填充值

本示例说明如何指定imwarp执行几何变换时使用的填充值。执行转换时&#xff0c;输出图像中通常会有一些像素不属于原始输入图像。必须为这些像素分配一些值&#xff0c;称为填充值。默认情况下&#xff0c;imwarp将这些像素设置为零&#xff0c;并显示为黑色。使用FillValues参…

micopython 18b20_MicroPython控制8*8LED点阵显示温度

MicroPython顾名思义就是可以在单片机上跑的Python&#xff0c;借助Micro Python&#xff0c;用户完全可以通过Python脚本语言实现硬件底层的访问和控制&#xff0c;比如说控制LED灯泡、LCD显示器、读取电压、控制电机、访问SD卡等。目前支持MicroPython的开发板有好几种&#…

ip变更会影响账号登陆吗_【教程】PUBG账号被盗导致封禁申诉解封教程

很多朋友询问PUBG在被盗号后被盗号者开挂导致永封该如何申诉解封&#xff0c;现在结合一些玩家被盗号及成功申诉的经历&#xff0c;详列一下步骤。本方法只适用于被盗后开挂导致封禁的账号&#xff0c;那些自己开挂被封的孤儿不用往下看了。一.先向steam客服申诉 找回自己的ste…

滤镜怎么调_手机、电脑怎么剪辑视频?真心求推荐实用工具

自从加入了短视频自媒体运营这个行业以后&#xff0c;我就开始接触到各种各样的手机、电脑视频剪辑、制作软件&#xff0c;用它们来处理、完成被安排到的工作任务。很多时候&#xff0c;我也用它们来剪视频&#xff0c;借此来练练手、积累下素材。记得刚进入这个行业的时候&…

2021计算机基础知识题库,2021~2021计算机基础知识练习题

2021~2021计算机基础知识练习题 2021~2021计算机基础知识练习题 北京联合大学 2021~2021计算机基础知识练习题 一、选择题 1.记录在存储介质上的一组相关信息的集合称为______。 A)程序 B)磁盘 C)软件 D)文件 2.当一个文件更名后&#xff0c;文件的内容会______。 A)完全消失 B…

计算机背板知识,你知道背板的选购技巧吗?

原标题&#xff1a;你知道背板的选购技巧吗&#xff1f;背板就是母板&#xff0c;子板插在上面构成系统&#xff0c;计算机背板说成背板也成立&#xff0c;只不过背板更多的知识线路板而已&#xff0c;没有实际的器件&#xff0c;只起信号通路作用。背板在设备机箱的后面。一般…