【LeetCode】十五、回溯法:括号生成 + 子集

文章目录

  • 1、回溯法
  • 2、leetcode22:括号生成
  • 3、leetcode78:子集

1、回溯法

在这里插入图片描述

使用场景,如找[1,2,3]的所有子集:

在这里插入图片描述

2、leetcode22:括号生成

在这里插入图片描述

以n=2为例,即两个左括号、两个右括号,枚举所有的情况:
在这里插入图片描述
从左往右数,当左括号的数量 < 右括号的数量时,就不是一个有效的括号,比如:

//一开始数到第一个就出现左括号的数量 < 右括号的数量
)()(
// 数到第三个时,左括号的数量 < 右括号的数量,无效
())(

如此,枚举所有可能性的过程中,如果出现左括号的数量 < 右括号的数量,则说明此路不通,终止递归,回溯到上一步重新选择

public class P22 {public List<String> generateParenthesis(int n) {List<String> result = new ArrayList<>();backTracking(n, result, 0, 0, "");return result;}/**** @param n 需要的括号的数量* @param result 存结果,有合适的结果就塞进result* @param left 左括号的数量* @param right 右括号的数量* @param str 左右括号的分隔符,比如” “*/public static void backTracking(int n, List<String> result, int left, int right, String str) {// 右括号的数量大于左括号的数量了,说明是无效括号,此路不通,终止递归if (right > left){return;}// 左括号的数量等于右括号的数量,等于要求的数量,说明找到结果了,加入结果集,终止递归if (left == right && right == n){result.add(str);return;}// 左括号的数量小于要求的,可以加个左括号if (left < n) {backTracking(n, result, left + 1, right, str + "(");}// 右括号的数量小于要求的,可以加个右括号if (right < n) {backTracking(n, result, left, right + 1, str + ")");}}
}

3、leetcode78:子集

在这里插入图片描述

解法一:扩展法

以空集开始,遍历给定集合的每个元素,并把上面每一层的结果和当前元素相加。比如给定[1,2,3]

在这里插入图片描述

比如上面,遍历到3时,把3并入到前面三层的结果集:

第一层结果:[]
第二层结果:[1]
第三层结果:[2]  [1,2]

就得到了第四层:[3] 、[1,3]、 [2,3] 、[1,2,3]。代码实现:

public class P78 {public static List<List<Integer>> subsets(int[] nums) {if (nums == null) {return null;}List<List<Integer>> result = new ArrayList<>();// 空集这个子集result.add(new ArrayList<>());for (int num : nums) {List<List<Integer>> temp = new ArrayList<>();for (List<Integer> element : result) {// 不能直接修改element,否则会改变结果集的元素// 用一个同类型的对象,拷贝一份,防止发生引用传递List<Integer> copy = new ArrayList<>(element);// 将给定数组的一个个元素,并入结果集的每个元素copy.add(num);// 存入临时结果集,别放入最终结果集,这样result一直变,循环就停不下了temp.add(copy);}// 一层遍历完了,把结果放进最终的结果集,准备将给定数组的下一个元素分别并入结果集,得到新的子集temp.stream().forEach(e -> result.add(e));}return result;}
}

以上注意:遍历前面的结果集里的每个元素时,用一个copy对象,防止引用传递。测试结果与分析时所画的顺序也一致:

在这里插入图片描述

解法二:回溯法

以[1,2,3]为例,思路:

  • 其子集的长度可能有:0、1、2、3
  • 按这四种可能长度循环,每次找到符合长度的的子集,就放入结果集
public class P78 {public static List<List<Integer>> subsets(int[] nums) {List<List<Integer>> result = new ArrayList<>();// 长度为0的子集:空集,先放入result.add(new ArrayList<Integer>());// 子集长度还可能是1~给定的数组长度for (int i = 1; i <= nums.length; i++) {backTracking(nums, result, i, 0, new ArrayList<>());}return result;}public static void backTracking(int[] nums, List<List<Integer>> result, int length, int index, List<Integer> subset) {// 递归的终止条件:找到了满足长度的子集,加入结果集,停止递归if (subset.size() == length) {List<Integer> copy = new ArrayList<>(subset);result.add(copy);return;}for (int i = index; i < nums.length; i++) {subset.add(nums[i]);backTracking(nums, result, length, i+1, subset);// 找到了[1,2],回溯,下一个该[1,3]了,这里remove掉2,以免下一个出现[1,2,3]subset.remove(subset.size() - 1);}}
}

解法三:DFS深度优先算法

public class P78 {public static List<List<Integer>> subsets(int[] nums) {List<List<Integer>> result = new ArrayList<>();dfs(nums, result, 0, new ArrayList<>());return result;}public static void dfs(int[] nums, List<List<Integer>> result, int index, List<Integer> subset) {List<Integer> copy = new ArrayList<>(subset);result.add(copy);if (index == nums.length) {return;}for (int i = index; i < nums.length; i++) {subset.add(nums[i]);dfs(nums, result, i+1, subset);subset.remove(subset.size() - 1);}}
}

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

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

相关文章

汇编实验5

本实验在32位Linux虚拟机中完成&#xff08;点击查看安装教程&#xff09; 实验内容 二进制炸弹实际是由C语言源程序生成的可执行目标代码&#xff0c;主程序可参考bomb.c。运行时&#xff0c;会按次序提示用户输入3个不同的字符串。如果输入的字符串有误&#xff0c;炸弹就会…

随手记:vsCode修改主题色为自定义颜色

因为工作需要长时间面对vscode&#xff0c;视力不好&#xff0c;想要把工具改成护眼色&#xff0c;于是就把vscode改成了自定义的护眼色 效果图&#xff1a; 操作步骤&#xff1a; 快捷键打开设置页面&#xff1a; 按住ctrlshiftp 选择Open setting 按回车键 打开setting页面编…

FlagEval 7月榜丨新增29个模型评测结果,智源发布评估技术报告《AI大模型能力全景扫描》

智源研究院FlagEval 7月榜单新增29个语言、多模态和文生图开源与闭源模型评测结果&#xff0c;包括阿里巴巴、OpenAI、快手、智谱等厂商近期发布的新模型。 本次评测发现&#xff0c;大语言模型&#xff0c;国产模型主观能力整体有所提升&#xff1b;视觉语言新模型的能力有所…

AI(Adobe lliustrator)教程+软件包

简介&#xff1a; 软件主要应用于印刷出版、海报书籍排版、专业插画、多媒体图像处理和互联网页面的制作等&#xff0c;也可以为线稿提供较高的精度和控制&#xff0c;适合生产任何小型设计到大型的复杂项目。 通常用于创建LOGO(商标或徽标)&#xff0c;图标&#xff0c;插图…

【数据结构】线性结构——数组、链表、栈和队列

目录 前言 一、数组&#xff08;Array&#xff09; 1.1优点 1.2缺点 1.3适用场景 二、链表&#xff08;Linked List&#xff09; 2.1优点 2.2缺点 2.3适用场景 三、栈&#xff08;Stack&#xff09; 3.1优点 3.2缺点 3.3适用场景 四、队列&#xff08;Queue&#xff09; 4.1优点…

广义可加模型和光滑曲线拟合的R代码

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

ABAQUS细观混凝土周期性边界(PBC)表征体元(REV)界面层(ITZ)及砂浆塑性损伤(CDP)模拟

混凝土的细观结构决定着其宏观破坏行为&#xff0c;对混凝土在结构尺度上采用细观模型将导致巨大的计算量而难以实现&#xff0c;表征体元&#xff08;‌REV&#xff09;‌方法可选取一定的平均范围来描述混凝土的性质和行为&#xff0c;这对于理解和模拟混凝土的损伤机理至关重…

测试用例的设计方法

等价类 等价类概念&#xff1a;在所有测试的数据中&#xff0c;具有某种共同特征的数据子集 边界值 边界值分析是对程序输入或输出的边界值进行测试的一种黑盒测试方法 边界值是作为等价类的补充&#xff0c;其主要区别是&#xff1a; 边界值测试设计不是从某一个等价类中…

15. 【C++】详解搜索二叉树 | KV模型

目录 1.定义 初始化 插入 查找 删除 完整代码 2.运用 K 模型和 KV 模型详解 K 模型 KV 模型 代码解释 为了更好地理解 map 和 set 的特性&#xff0c;和后面讲解查找效率极高的平衡搜索二叉树&#xff0c;和红黑树去实现模拟&#xff0c;所以决定在这里对搜索二叉树…

Google资深工程师深度讲解Go语言-课程笔记

课程目录&#xff1a; 第1章 课程介绍 欢迎大家来到深度讲解Go语言的课堂。本课程将从基本语法讲起&#xff0c;逐渐深入&#xff0c;帮助同学深度理解Go语言面向接口&#xff0c;函数式编程&#xff0c;错误处理&#xff0c;测试&#xff0c;并行计算等元素&#xff0c;并带…

(vue)Vue读取public中的json文件,打包后只需更改包文件

(vue)Vue读取public中的json文件,打包后只需更改包文件 背景&#xff1a;增加账号需求。原本是在页面&#xff0c;每次都需技术人员添加再打包部署&#xff0c;现在放到json里&#xff0c;以后直接服务器改json就行。 旧版&#xff1a; let userArr [{username:aaa,password:…

VLAN 划分案例详解

vlan 的应用在网络项目中是非常广泛的&#xff0c;基本上大部分的项目都需要划分 vlan&#xff0c;这里从基础的 vlan 的知识开始&#xff0c;了解 vlan 的划分原理。 为什么需要 vlan&#xff1a; 1、什么是 VLAN&#xff1f; VLAN&#xff08;Virtual LAN&#xff09;&…

Python数据分析实战:利用ARIMA模型洞察股市规律

在股市中&#xff0c;数据的波动与变化风云莫测&#xff0c;难以捉摸。然而&#xff0c;借助科学的分析方法和工具&#xff0c;我们或许能够找到一些数据规律。今天&#xff0c;我们聊聊如何使用Python编程语言&#xff0c;结合ARIMA模型来洞察股市的变幻&#xff0c;为我们的投…

【TCP通信】

7.18学习记录 NetAssist.exeTCP/IP协议准备工作做好之后开始创建方案 通信架构设备管理接收事件发送事件心跳管理响应配置 VM4.0二次开发 NetAssist.exe 网络协议调试助手文件&#xff0c;支持UDP和TCP协议。只需要输入主机的地址和端口就能获取数据解析。要用到的协议是 TCP/…

wps office 2019 Pro Plus 集成序列号Vba安装版教程

前言 wps office 2019专业增强版含无云版是一款非常方便的办公软件&#xff0c;我们在日常的工作中总会碰到需要使用WPS的时候&#xff0c;它能为我们提供更好的文档编写帮助我们更好的去阅读PDF等多种格式的文档&#xff0c;使用起来非常的快捷方便。使用某银行专业增强版制作…

生活中生智慧

【 圣人多过 小人无过 】 觉得自己做得不够才能做得更好&#xff0c;互相成全&#xff1b;反求诸己是致良知的第一步&#xff1b;有苦难才能超越自己&#xff0c;开胸怀和智慧&#xff1b;不浪费任何一次困苦&#xff0c;危机中寻找智慧&#xff0c;成长自己。 把困苦当作当下…

Linux——awk操作符

[rootlocalhost ~] # awk BEGIN{x2;y3;print x**y,x^y,x*y,x/y,xy,x-y,x%y} 8 8 6 0 .666667 5 -1 2 赋值运算符 条件运算符 awk 中的条件运算符只有一个&#xff0c;其语法如下&#xff1a; expression?value1:value2 这是一个三目运算符&#xff0c;当表达式 expre…

MySQL索引特性(上)

目录 索引的重要 案例 认识磁盘 MySQL与存储 先来研究一下磁盘 扇区 定位扇区 结论 磁盘随机访问与连续访问 MySQL与磁盘交互基本单位 建立共识 索引的理解 建立测试表 插入多条记录 局部性原理 所有的MySQL的操作(增删查改)全部都是在MySQL当中的内存中进行的&am…

【删除链表的倒数第N个节点】python刷题记录

目录 哑结点 为什么设置哑节点&#xff1f; 方法1&#xff08;先遍历统计长度&#xff0c;再查找具体位置&#xff09;&#xff1a; 方法2&#xff08;双指针&#xff09;&#xff1a; 链表基本用法 哑结点 在链表前面添加哑节点&#xff0c;指向头节点 为什么设置哑节点…

系统架构师考点--统一建模语言UML

大家好。今天我来总结一下面向对象的第二个考点–统一建模语言UML。 UML(统一建模语言)是一种可视化的建模语言&#xff0c;而非程序设计语言&#xff0c;支持从需求分析开始的软件开发的全过程。UML的结构包括构造块、规则和公共机制三个部分。其中考点主要集中在构造块部分&…