递归 深搜 回溯练习

递归 深搜 回溯

    • 题目一. 全排列II
      • 1. 题⽬链接:
      • 2. 题⽬描述:
      • 3. 解法:
      • 4.代码
    • 题目二. 电话号码的字⺟组合
      • 1. 题⽬链接:
      • 2. 题⽬描述:
      • 3. 解法:
      • 4.代码
    • 题目三. 括号⽣成(medium)
      • 1. 题⽬链接:
      • 2. 题⽬描述:
      • 3. 解法:
      • 代码

题目一. 全排列II

1. 题⽬链接:

https://leetcode.cn/problems/permutations-ii/description/

2. 题⽬描述:

在这里插入图片描述

3. 解法:

算法思路:
因为题⽬不要求返回的排列顺序,因此我们可以对初始状态排序,将所有相同的元素放在各⾃相邻的
位置,⽅便之后操作。因为重复元素的存在,我们在选择元素进⾏全排列时,可能会存在重复排列,
例如:[1, 2, 1],所有的 下标排列 为:

123
132
213
231
312
321

按照以上下标进⾏排列的结果为:

121
112
211
211
112
121

可以看到,有效排列只有三种[1, 1, 2],[1, 2, 1],[2, 1, 1],其中每个排列都出现两次。因此,我们需要对相同元素定义⼀种规则,使得其组成的排列不会形成重复的情况:

  1. 我们可以将相同的元素按照排序后的下标顺序出现在排列中,通俗来讲,若元素 s 出现 x 次,则排序后的第 2 个元素 s ⼀定出现在第 1 个元素 s 后⾯,排序后的第 3 个元素 s ⼀定出现在第 2 个元素 s 后⾯,以此类推,此时的全排列⼀定不会出现重复结果。

  2. 例如:a1=1,a2=1,a3=2,排列结果为 [1, 1, 2] 的情况只有⼀次,即 a1 在 a2 前⾯,因为 a2 不会出现在 a1 前⾯从⽽避免了重复排列。

  3. 我们在每⼀个位置上考虑所有的可能情况并且不出现重复;

  4. 注意:若当前元素的前⼀个相同元素未出现在当前状态中,则当前元素也不能直接放⼊当前状态 的数组,此做法可以保证相同元素的排列顺序与排序后的相同元素的顺序相同,即避免了重复排列 出现。

  5. 通过深度优先搜索的⽅式,不断地枚举每个数在当前位置的可能性,并在递归结束时回溯到上⼀个状态,直到枚举完所有可能性,得到正确的结果。

递归函数设计:

public void dfs(int[] nums, int pos) 参数:pos(当前需要填⼊的位置); 返回值:⽆;
函数作⽤:查找所有合理的排列并存储在答案列表中。

递归流程如下:

  1. 定义⼀个⼆维数组 ans ⽤来存放所有可能的排列,⼀个⼀维数组 perm ⽤来存放每个状态的排列, ⼀个⼀维数组 visited 标记元素,然后从第⼀个位置开始进⾏递归;

  2. 在每个递归的状态中,我们维护⼀个步数 idx,表⽰当前已经处理了⼏个数字;

  3. 递归结束条件:当 idx 等于 nums 数组的⻓度时,说明我们已经处理完了所有数字,将当前数组存 ⼊结果中;

  4. 在每个递归状态中,枚举所有下标 i,若这个下标未被标记,并且在它之前的相同元素被标记过, 则使⽤ nums 数组中当前下标的元素:

a. 将 visited[i] 标记为 1;

b. 将 nums[i] 添加⾄ perm 数组末尾;

c. 对第 step+1 个位置进⾏递归;

d. 将 visited[i] 重新赋值为 0,并删除 perm 末尾元素表⽰回溯;

  1. 最后,返回 ans。 C++ 算法代码:

4.代码

class Solution 
{List<Integer> path;List<List<Integer>> ret;boolean[] check;public List<List<Integer>> permuteUnique(int[] nums) {path = new ArrayList<>();ret = new ArrayList<>();check = new boolean[nums.length];Arrays.sort(nums);dfs(nums, 0);return ret;}public void dfs(int[] nums, int pos){if(pos == nums.length){ret.add(new ArrayList<>(path));return;}for(int i = 0; i < nums.length; i++){// 剪枝 if(check[i] == false && (i == 0 || nums[i] != nums[i - 1] || 
check[i - 1] != false)){path.add(nums[i]);check[i] = true;dfs(nums, pos + 1);// 回溯 -> 恢复现场 path.remove(path.size() - 1);check[i] = false;}}}
}

题目二. 电话号码的字⺟组合

1. 题⽬链接:

https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/

2. 题⽬描述:

在这里插入图片描述

3. 解法:

算法思路:
每个位置可选择的字符与其他位置并不冲突,因此不需要标记已经出现的字符,只需要将每个数字对
应的字符依次填⼊字符串中进⾏递归,在回溯是撤销填⼊操作即可。
• 在递归之前我们需要定义⼀个hash表,记录 2~9 各⾃对应的字符。

递归函数流程如下:

  1. 递归结束条件:当 index 等于 digits 的⻓度时,将 ans 加⼊到 res 中并返回;

  2. 取出当前处理的数字 digit,根据 phoneMap 取出对应的字⺟列表 letters;

  3. 遍历字⺟列表 letters,将当前字⺟加⼊到组合字符串 ans 的末尾,然后递归处理下⼀个数字(传 ⼊ index + 1,表⽰处理下⼀个数字);

  4. 递归处理结束后,将加⼊的字⺟从 ans 的末尾删除,表⽰回溯。

  5. 最终返回 res 即可。

4.代码

class Solution 
{String[] hash = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};List<String> ret;StringBuffer path;public List<String> letterCombinations(String digits) {ret = new ArrayList<>();path = new StringBuffer();if(digits.length() == 0) return ret;dfs(digits, 0);return ret;}public void dfs(String digits, int pos){if(pos == digits.length()){ret.add(path.toString());return;}String cur = hash[digits.charAt(pos) - '0'];for(int i = 0; i < cur.length(); i++){path.append(cur.charAt(i));dfs(digits, pos + 1);path.deleteCharAt(path.length() - 1); // 恢复现场 }}
}

题目三. 括号⽣成(medium)

1. 题⽬链接:

https://leetcode.cn/problems/generate-parentheses/description/

2. 题⽬描述:

在这里插入图片描述

3. 解法:

算法思路:
从左往右进⾏递归,在每个位置判断放置左右括号的可能性,若此时放置左括号合理,则放置左括号
继续进⾏递归,右括号同理。
⼀种判断括号是否合法的⽅法:从左往右遍历,左括号的数量始终⼤于等于右括号的数量,并且左括
号的总数量与右括号的总数量相等。因此我们在递归时需要进⾏以下判断:

  1. 放⼊左括号时需判断此时左括号数量是否⼩于字符串总⻓度的⼀半(若左括号的数量⼤于等于字符 串⻓度的⼀半时继续放置左括号,则左括号的总数量⼀定⼤于右括号的总数量);

  2. 放⼊右括号时需判断此时右括号数量是否⼩于左括号数量

递归流程如下:

  1. 递归结束条件:当前状态字符串⻓度与 2*n 相等,记录当前状态并返回;

  2. 若此时左括号数量⼩于字符串总⻓度的⼀半,则在当前状态的字符串末尾添加左括号并继续递归, 递归结束撤销添加操作;

  3. 若此时右括号数量⼩于左括号数量(右括号数量可以由当前状态的字符串⻓度减去左括号数量求 得),则在当前状态的字符串末尾添加右括号并递归,递归结束撤销添加操作

代码

class Solution 
{int left, right, n;StringBuffer path;List<String> ret;public List<String> generateParenthesis(int _n) {n = _n;path = new StringBuffer();ret = new ArrayList<>();dfs();return ret;}public void dfs(){if(right == n){ret.add(path.toString());return;}if(left < n) // 添加左括号 {path.append('('); left++;dfs();path.deleteCharAt(path.length() - 1); left--; // 恢复现场 }if(right < left) // 添加哎右括号 {path.append(')'); right++;dfs();path.deleteCharAt(path.length() - 1); right--; // 恢复现场 }}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

论文阅读笔记- Language Modeling with Gated Convolutional Networks

前言 统计语言模型本质上是在给定前面若干个单词的条件下&#xff0c;通过概率建模来估计单词序列的概率分布&#xff0c;即&#xff1a; P ( w 0 , . . . , W N ) P ( w 0 ) ∏ i 1 N P ( w i ∣ w 0 , . . . , w i − 1 ) P(w_0,...,W_N)P(w_0)\prod_{i1}^NP(w_i|w_0,...…

dvwa:文件包含、文件上传

文件包含 本地文件包含&#xff08;敏感信息泄露&#xff09;和远程文件包含&#xff08;命令执行&#xff09; 本地文件包含一般包含一些本地的敏感文件&#xff0c;如&#xff1a;/etc/passwd或/etc/shadow等 远程文件包含能使得服务器代码执行&#xff0c;如包含黑客vps的…

文心一言 VS 讯飞星火 VS chatgpt (365)-- 算法导论24.3 7题

七、给定带权重的有向图 G ( V &#xff0c; E ) G(V&#xff0c;E) G(V&#xff0c;E)&#xff0c;其权重函数为 w : E → ( 1 &#xff0c; 2 &#xff0c; … &#xff0c; W ) w:E→(1&#xff0c;2&#xff0c;…&#xff0c;W) w:E→(1&#xff0c;2&#xff0c;…&…

2024年诺贝尔物理学奖 机器学习与神经网络领域前景面面观 如何抉择

近日&#xff0c;2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者&#xff0c;这是历史上首次出现这样的情况。这项奖项原本只授予对自然现象和物质的物理学研究作出重大贡献的科学家&#xff0c;如今却将全球范围内对机器学习和神经网络的研究和开发作为了一种能…

基于微信小程序的家校联动平台管理系统的设计与实现(毕业论文)

目 录 第一章 绪论 1 1.1研究背景 1 1.1.1教育信息化的发展 1 1.1.2家校沟通的重要性 1 1.1.3微信小程序的优势 1 1.2国内外研究现状 1 1.2.1教育管理信息系统 1 1.2.2家校互动平台 1 1.2.3微信小程序在教育领域的应用 2 1.3本文的主要工作 2 1.3.1系统需求分析 2 1.3.2系统设计…

边缘智能(Edge Intelligence):智能计算的前沿

随着物联网&#xff08;IoT&#xff09;、5G网络和人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;边缘智能&#xff08;Edge Intelligence&#xff09;作为一种新兴的技术理念&#xff0c;逐渐成为数字化时代的重要组成部分。边缘智能通过在靠近数据生成端&#xf…

正则表达式-“三剑客”(grep、sed、awk)

1.3正则表达式 正则表达式描述了一种字符串匹配的模式&#xff0c;可以用来检查一个串是否含有某种子串&#xff0c;将匹配的子串替换或者从某个串中取出符号某个条件的子串等&#xff0c;在linux中代表自定义的模式模版&#xff0c;linux工具可以用正则表达式过滤文本。Linux…

《网络安全自学教程》- Nmap使用及扫描原理分析

《网络安全自学教程》 Nmap&#xff08;Network Mapper&#xff09;是一款免费的开源网络扫描器&#xff0c;向目标主机发送特定的数据包&#xff0c;根据返回的流量特征&#xff0c;分析主机信息。主要功能有&#xff1a;「端口扫描」、「主机探测」、「服务识别」和「系统识别…

Linux之实战命令32:chroot应用实例(六十六)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

字节跳动最新音乐生成模型Seed-Music

Seed-Music是一个由字节跳动研发的音乐生成模型&#xff0c;用户可以通过输入多模态数据&#xff08;如文本描述、音频参考、乐谱、声音提示等&#xff09;来生成音乐&#xff0c;并且提供了方便的后期编辑功能&#xff0c;比如修改歌词或旋律。 Seed-Music 结合了自回归语言模…

CentOS快速配置网络Docker快速部署

CentOS裸机Docker部署 1.联通外网 vi /etc/sysconfig/network-scripts/ifcfg-ens33systemctl restart networkip addrping www.baidu.com2.配置CentOS镜像源 参考文章 进入/etc/yum.repos.d目录下找到 CentOS-Base.repo cd /etc/yum.repos.dcp CentOS-Base.repo CentOS-B…

双向广搜 bfs进阶 open the lock——hdu1195

目录 前言 传统bfs 双向广搜 open the lock 问题描述 输入 输出 问题分析 状态转变 去重 单向搜索的bfs 双向广搜 结束条件 输出步数 前言 其实这题数据不算复杂&#xff0c;不用双向广搜也可以完成&#xff0c;仅仅是为了更直观展现双向广搜的编码方式。 传统bfs bfs向来都…

通用文件I/O模型之open

前面介绍了linux系统一切皆文件的概念&#xff0c;系统使用一套系统调用函数open()、read()、write()、close()等可以对所有文件执行I/O操作。应用程序发起的I/O请求&#xff0c;内核会将其转化为相应的文件系统操作&#xff0c;或者设备驱动程序操作。接下来我们一起了解一下o…

电磁兼容(EMC):整改案例(五)EFT测试,改初级Y电容

目录 1. 异常现象 2. 原因分析 3. 整改方案 4. 总结 1. 异常现象 某产品按GB/T 17626.4标准进行电快速瞬变脉冲群测试&#xff0c;测试条件为&#xff1a;频率5kHz/100kHz&#xff0c;测试电压L&#xff0c;N线间2kV。其中频率5kHz时&#xff0c;测试通过&#xff0c;但频…

在Centos中安装、配置与使用atop监控工具

目录 前言1. atop工具的安装1.1 atop简介1.2 atop的安装步骤 2. 安装并配置netatop模块2.1 安装内核开发包2.2 安装所需依赖2.3 下载netatop2.4 解压并安装netatop2.5 启动netatop 3. atop的配置与使用3.1 配置监控周期与日志保留时间3.2 设置定时任务生成日志3.3 启动与查看at…

【2024年最新】基于springboot+vue的垃圾分类网站lw+ppt

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…

Facebook脸书投放目录guanggao(更适合独立站)操作步骤教学

Facebook guanggao是企业进行品牌推广、产品销售和营销转化的有效工具。在Facebook guanggao中创建目录可以帮助企业更好地展示产品&#xff0c;提高guanggao效果。以下是创建目录的详细步骤&#xff1a; 登录Facebook Business Manager&#xff08;BM业务管理器&#xff09;&a…

yolo 11从原理、创新点、训练到部署(yolov11代码+教程)

YOLO&#xff08;You Only Look Once&#xff09;系列模型以其高效的目标检测能力在计算机视觉领域取得了显著的成果。YOLOv11 作为 YOLO 系列的最新进展&#xff0c;进一步提升了模型的性能和实用性。本文将从 YOLOv11 的原理、创新点、训练到部署进行详细介绍&#xff0c;并附…

【写个本地的html】写个本地的html文件,做个demo,直接用浏览器打开

需求:需要给甲方发个html文件版本的demo,本地打开,如图所示 ui给了6张图片,写6个按钮点击更换背景图片 代码没写完,但是基础结构都有,供大家参考: 创建一个文件夹,用vscode打开,创建index.html index.html代码如下 <!DOCTYPE html> <html> <head&g…

【含开题报告+文档+PPT+源码】基于springBoot+vue超市仓库管理系统的设计与实现

开题报告 随着电子商务的快速发展和物流行业的日益壮大&#xff0c;超市仓库管理系统的重要性也日益凸显。传统的超市仓库管理方式存在许多问题&#xff0c;比如人工操作繁琐、数据统计不准确、管理效率低下等。因此&#xff0c;需要设计和实现一个高效、智能的超市仓库管理系…