【寸铁的刷题笔记】树、回溯、图论、bfs、dfs(四)

【寸铁的刷题笔记】树、回溯、图论、bfs、dfs(四)

大家好 我是寸铁👊
金三银四图论基础回溯结合bfsdfs是必考的知识点✨
快跟着寸铁刷起来!面试顺利上岸👋
喜欢的小伙伴可以点点关注 💝


🌞详见如下专栏🌞

🍀🍀🍀寸铁的刷题笔记🍀🍀🍀


17. 电话号码的字母组合

考点

dfs、回溯


代码

class Solution {//创建一个列表,用于存储组合的结果List<String>list = new ArrayList<>();public List<String> letterCombinations(String digits) {//如果说digits字符串为空或者长度为0//则说明没有任何可以组合的字符,直接返回空列表即可。if(digits == null || digits.length() == 0)return list;//使用数组存储一个映射,也可以使用map<Integer , String>存储String[]numString = {" ",//下标为0" ",//下标为1"abc",//2"def","ghi","jkl","mno","pqrs","tuv","wxyz"};//递归//传入参数: 数字字符串,numString映射数组,当前搜索的层数backTracing(digits , numString , 0);//返回最后的列表return list;}//用stringbuilder进行拼接StringBuilder temp = new StringBuilder();public void backTracing(String digits , String[] numString , int num){//如果说最后的层数等于数字的长度//则说明已经搜索完了,入队即可。if(num == digits.length()){list.add(temp.toString());return;}//获取数字所对应的映射字符串String str = numString[digits.charAt(num) - '0'];//进行dfs暴搜//枚举第一个数字for(int i = 0; i < str.length(); i++){//添加到temp中temp.append(str.charAt(i));//继续向下一层递归backTracing(digits , numString , num + 1);//恢复现场,向上回溯temp.deleteCharAt(temp.length() - 1);//向上回溯}}
}

77. 组合

考点

dfs、回溯


代码

class Solution {List<List<Integer>>result = new ArrayList<>();LinkedList<Integer>path = new LinkedList<>();//可以删除最后一个元素 removeLast()//再转为ArrayList<>()public List<List<Integer>> combine(int n, int k) {combineHelper(n , k ,1);//确定入参 n表示数字1 - n  k 表示组合的大小return result;//返回最终的结果}public void combineHelper(int n , int k , int startIndex){if(path.size() == k){result.add(new ArrayList<>(path));return;}for(int i = startIndex; i <= n; i++){//添加元素path.add(i);//递归到下一层 注意: 起始数字从 i + 1开始,确保数字组合不重复。//每次递归时,都从上一个数字的下一个数开始,这样就不会导致组合出现重复。combineHelper(n , k , i + 1);//向上回溯path.removeLast();}}
}

127. 单词接龙

考点

bfs、宽度搜索、哈希表


思路

先用一个Map存储单词列表,后面用于匹配单词使用。
暴力搜索单词长度下的字母每一位的26种可能,再去与单词列表进行匹配,匹配成功则标记该单词已经走过
同时,单词序列的长度(bfs搜索的层数)++,
如何确保转换序列最短?
这里我们是一层层搜索,每一层优先去匹配最后的单词
匹配的上,谁所在的那一层就是最短的序列长度
如果说匹配的上,则直接返回序列长度
如果说匹配不上,则把当前搜索到的节点入队,用于下一层的继续搜索。


代码

class Solution {/*bfs暴搜用一个Map存储单词列表,后面用于匹配单词使用。暴力搜索单词长度下的字母每一位的26种可能,再去与单词列表进行匹配,匹配成功则标记该单词已经走过。同时,单词序列的长度(bfs搜索的层数)++,单词入队,用于下一轮的搜索。最后,判断能否走到最后一个单词,也就是当搜索时匹配到最后一个单词时,搜索停止,返回走过的序列长度。如何确保转换序列最短?这里我们是一层层搜索,每一层优先去匹配最后单词。如果说匹配的上,则返回序列长度。如果说匹配不上,则把当前搜索的节点入队,用于下一层的继续搜索。*/public int ladderLength(String beginWord, String endWord, List<String> wordList) {//如果说开头的单词的长度与最后一个单词的长度不同,则不存在这样的转换序列。if(beginWord.length() != endWord.length())return 0;int n = beginWord.length();//创建一个单词库,用于后面的单词匹配。Set<String>wordsLib = new HashSet<>();for(String word : wordList){wordsLib.add(word);}//如果说终点单词不在单词库中则不存在这样的转换序列。if(!wordsLib.contains(endWord))return 0;//宽搜//创建标记Set记录已经走过的节点Set<String>visited = new HashSet<>();visited.add(beginWord);//标记起点节点已经被搜索过//维护一个队列,用于宽搜。Queue<Node> queue = new LinkedList<>();queue.add(new Node(beginWord , 1)); while(!queue.isEmpty()){//弹出当前队列的节点进行宽搜Node cur = queue.poll();String curWord = cur.word;//记录弹出节点的单词int cnt = cur.cnt; //记录弹出节点的单词长度//每次弹出一个单词,序列的长度就++//因为要往下一层搜索,是一层层搜索,如果最后找到,则返回找到的序列长度即可//找不到则返回0 cnt++; //bfs搜索的层数(序列长度)加1System.out.println(curWord);System.out.println(cnt);//a --> c//暴力搜索//注意:这个搜索的话,是一层层搜。//每次搜索时,会优先考虑是否与最后一个单词匹配,确保序列长度是最短的。//如果匹配上,则直接返回序列长度即可,此时的序列长度为最短//如果没有匹配,则先把这一层搜索到的节点入队,用于下一层搜索。for(int i = 0 ; i < n; i++){for(int j = 0; j < 26; j++){StringBuilder nextWordBuilder = new StringBuilder(curWord);nextWordBuilder.setCharAt(i , (char)('a' + j));String nextWord = nextWordBuilder.toString();//如果说该节点没被遍历过并且单词库中有该节点if(!visited.contains(nextWord) && wordsLib.contains(nextWord)){if(nextWord.equals(endWord))return cnt;//如果说暴搜的单词等于最后一个单词则返回序列的长度System.out.println(nextWord);visited.add(nextWord);//标记该节点已经被遍历过queue.offer(new Node(nextWord , cnt));//把该节点入队}}}}return 0;//找不到转换序列 则返回0}
}
//节点类
class Node{String word;//单词int cnt;//序列长度public Node(String word , int cnt){this.word = word;this.cnt = cnt;}
}

124. 二叉树中的最大路径和

考点

dfs、递归

思路

要求:返回其最大路径和
做法:路径和:枚举每个点作为起点,加上左右子树的值,取最大值即可。
先递归处理根节点的左右分支,向下走到底,把叶子节点的最大路径和取一个最大值。
回溯:向上回溯时,会计算上层根节点的路径和,继续取一个最大值。
返回:由于每个节点只能选一条路走,最大路径和下应该选择左右分支的最大值分支

代码

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {int maxSum = Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {//递归函数入口maxGain(root);//返回最大路径和return maxSum;}//题意分析:/*要求:返回其最大路径和做法:路径和:枚举每个点作为起点,加上左右子树的值,取最大值即可。先递归处理根节点的左右分支,向下走到底,把叶子节点的最大路径和取一个最大值。回溯:向上回溯时,会计算上层根节点的路径和,继续取一个最大值。返回:由于每个节点只能选一条路走,最大路径和下应该选择左右分支的最大值分支*/public int maxGain(TreeNode node){if(node == null){return 0;}//向左递归,计算左子树的叶子节点的最大路径和//如果小于0 则不选该分支 因为选了后路径和反而更小int leftGain = Math.max(maxGain(node.left) , 0);//向右递归,计算右子树的叶子节点的最大路径和//如果小于0 则不选该分支 因为选了后路径和反而更小int rightGain = Math.max(maxGain(node.right) , 0);//计算//回溯时,会依次把上层非叶子节点做为根节点,计算其路径和int priceNewPath = node.val + leftGain + rightGain;//把每次计算的结果取一个maxmaxSum = Math.max(maxSum , priceNewPath);//返回一条较大路径 给上层节点继续计算路径和return node.val + Math.max(leftGain , rightGain);}
}

98. 验证二叉搜索树

考点

DFS、双指针、回溯
530. 二叉搜索树的最小绝对差的处理逻辑类似

思路

思想:根据定义,节点的左子树小于当前节点,节点的右子树大于当前节点
也就是left < middle < right
很自然的就想到了用中序遍历,再判断一下是否满足left < middle < right即可
进一步,我们只需要判断当前的节点是否小于之前的节点。
如果小于则不满足条件,向上返回false即可。
否则,则满足条件。


代码

class Solution {/*思想:根据定义,节点的左子树小于当前节点,节点的右子树大于当前节点也就是left < middle < right很自然的就想到了用中序遍历,再判断一下是否满足left < middle < right即可进一步,我们只需要判断当前的节点是否小于之前的节点。如果小于则不满足条件,向上返回false即可。否则,则满足条件。*/TreeNode pre; //存储上一个节点public boolean isValidBST(TreeNode root) {//如果节点为空则直接返回trueif(root == null)return true;//左 创建一个变量记录左子树递归的结果boolean left = isValidBST(root.left);if(!left){return false;}//中 处理条件的逻辑 判断当前节点是否 <= 上一个节点if(pre != null && root.val <= pre.val){return false;}//一开始为空,记录上一个节点。pre = root;//右 创建一个变量记录右子树递归的结果boolean right = isValidBST(root.right);//向上返回右子树递归的结果 right// if(!right){//     return false;// }//与下等效,考虑到方法的返回语句,如下编译通过。return right;}
}

往期好文💕

保姆级教程

【保姆级教程】Windows11下go-zero的etcd安装与初步使用

【保姆级教程】Windows11安装go-zero代码生成工具goctl、protoc、go-zero

【Go-Zero】手把手带你在goland中创建api文件并设置高亮


报错解决

【Go-Zero】Error: user.api 27:9 syntax error: expected ‘:‘ | ‘IDENT‘ | ‘INT‘, got ‘(‘ 报错解决方案及api路由注意事项

【Go-Zero】Error: only one service expected goctl一键转换生成rpc服务错误解决方案

【Go-Zero】【error】 failed to initialize database, got error Error 1045 (28000):报错解决方案

【Go-Zero】Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)报错解决方案

【Go-Zero】type mismatch for field “Auth.AccessSecret“, expect “string“, actual “number“报错解决方案

【Go-Zero】Error: user.api 30:2 syntax error: expected ‘)‘ | ‘KEY‘, got ‘IDENT‘报错解决方案

【Go-Zero】Windows启动rpc服务报错panic:context deadline exceeded解决方案


Go面试向

【Go面试向】defer与time.sleep初探

【Go面试向】defer与return的执行顺序初探

【Go面试向】Go程序的执行顺序

【Go面试向】rune和byte类型的认识与使用

【Go面试向】实现map稳定的有序遍历的方式

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

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

相关文章

GitHub登不上:修改hosts文件来解决(GitHub520,window)

参考链接&#xff1a;GitHub520: 本项目无需安装任何程序&#xff0c;通过修改本地 hosts 文件&#xff0c;试图解决&#xff1a; GitHub 访问速度慢的问题 GitHub 项目中的图片显示不出的问题 花 5 分钟时间&#xff0c;让你"爱"上 GitHub。 (gitee.com) GitHub网站…

【Redis】Redis 实现分布式Session

Cookie 保存在客户端浏览器中&#xff0c;而 Session 保存在服务器上。客户端浏览器访问服务器的时候&#xff0c;服务器把客户端信息以某种形式记录在服务器上&#xff0c;这就是 Session。客户端浏览器再次访问时只需要从该 Session 中查找该客户的状态就可以了。 在实际工作…

mybatis plus 根据要求构建sql wrapper

文章目录 要求: 构建sql wrapper错误写法解决方案 要求: 构建sql wrapper 根据要求构建sql wrapper&#xff1a;dto.getProjectId() null&#xff0c;则 where project_id is nulldto.getProjectId() ! null&#xff0c;则 where project_id 58b1fad6-adaa-4834-8337-8d43834…

leetcode 移除链表元素

本题中&#xff0c;我们是要移除链表的某一个节点&#xff0c;为了确保统一操作&#xff0c;我们需要使用虚拟头节点&#xff0c;这样我们删除节点的时候&#xff0c;就是把这个要删除的节点&#xff08;当前节点cur&#xff09;的前一个节点pre&#xff0c;使得pre.next指向要…

RabbitMQ相关问题

Mybatis框架相关问题 RabbitMQ相关问题 一、RabbitMQ的核心组件和工作原理&#xff1f;二、如何保证消息可靠投递不丢失的&#xff1f;三、RabbitMQ如何保证消息的幂等性&#xff1f;四、什么是死信队列&#xff1f;死信队列是如何导致的&#xff1f;五、RabbitMQ死信队列是如…

面向对象知识点--全学习内容(day20)阶段测试题见资料

面向对象 一、初识面向对象 见文件资料的面向对象.md 全内容梳理 类与实体概念 现实生活&#xff1a; ​ 类&#xff1a;抽象的概念&#xff0c;把具有相同特征和操作的事物归为一类 ​ 先有实体&#xff0c;再有类的概念 代码世界&#xff1a; ​ 类&#xff1a;抽象的概念&a…

java.lang.NoClassDefFoundError: lombok/Data报错问题.

今天拉取一个git代码&#xff0c;启动后报错&#xff1a;java.lang.NoClassDefFoundError: lombok/Data 检查以后&#xff0c;发现是因为属性上使用了Data&#xff0c;引用的是lombok.Data的包造成的。 可以看到这个类中有一个好几个Data。这里就很严重了&#xff0c;造成这个…

回溯 Leetcode 332 重新安排行程

重新安排行程 Leetcode 332 学习记录自代码随想录 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&a…

【Datawhale组队学习:Sora原理与技术实战】Attention

Attention Attention 注意力&#xff0c;从两个不同的主体开始。 论文&#xff1a;https://arxiv.org/pdf/1703.03906.pdf seq2seq代码仓&#xff1a;https://github.com/google/seq2seq 计算方法&#xff1a; 加性Attention&#xff0c;如&#xff08;Bahdanau attention&…

【工商业储能如何选】Acrel工商业储能系统解决方案

市场前景 碳中和&#xff1a;全球应对气候危机重建人与自然和谐关系的共同目标 清洁替代&#xff1a;清洁能源替代化石能源是全球实现碳中和的唯一路径 能量存储&#xff1a;储能技术是解决大比例清洁能源时空分布不平衡的最佳方案 应用场景 随着“双碳”目标下的新型电力…

Python+Selenium使用Page Object实现页面自动化测试

Page Object模式是Selenium中的一种测试设计模式&#xff0c;主要是将每一个页面设计为一个Class&#xff0c;其中包含页面中需要测试的元素&#xff08;按钮&#xff0c;输入框&#xff0c;标题 等&#xff09;&#xff0c;这样在Selenium测试页面中可以通过调用页面类来获取页…

记一次:android学习笔记一(学习目录-不要看无内容)

学习目录如下 B站学习的名称--Android开发从入门到精通(项目案例版) 网址:https://www.bilibili.com/video/BV1jW411375J/ 第0章:安装 android stoid 参考地址https://blog.csdn.net/adminstate/article/details/130542368 第一章:第一个安卓应用 第二章:用户界面设…

idea插件开发的时候找不到com.intellij.psi.PsiClass

最近在使用idea上传接口带yapi(可视化管理平台)时遇到com.intellij.psi.PsiClass&#xff0c;在网上看了找到几种解决方案&#xff0c;这里总结记录一下&#xff1a; 方法一&#xff1a;在 build.gradle 中的 intellij plugins属性添加 ‘java’ intellij {version 2020.X.Xpl…

直接修改zynq petalinux编译出来的rootfs.cpio.gz文件内容

xilinx zynq petalinux 默认编译打包出的SPI flash烧写启动文件是BOOT.BIN&#xff0c;然而每次需要修改rootfs内的文件时都要重新build rootfs 然后再 package一次才能生成新的BOOT.bin文件&#xff0c;地球人都知道petalinux编译一次是很耗时间的&#xff0c;那么有没有什么简…

OpenCV 4基础篇| OpenCV图像的拆分和合并

目录 1. 通道拆分1.1 cv2.split1.1.1 语法结构1.1.2 注意事项1.1.3 代码示例 1.2 NumPy切片1.2.1 代码示例 2. 通道合并2.1 cv2.merge2.1.1 语法结构2.1.2 注意事项2.1.3 代码示例 1. 通道拆分 1.1 cv2.split 1.1.1 语法结构 b,g,r cv2.split(img[, mv]) #图像拆分为 BGR 通…

【开发工具】GIF 录屏工具推荐 ( GIF123 - 推荐使用 | GifCam | LICEcap )

文章目录 一、GIF 录屏工具推荐1、GIF123 ( 推荐使用 )2、GifCam3、LICEcap 本博客中介绍的 3 款 GIF 录屏工具下载地址 : https://download.csdn.net/download/han1202012/88905642 也可以到对应的官网独立下载 : GIF123 : https://gif123.aardio.com/ ;GifCam : https://bl…

FAST-LIO系列-阅读笔记

近期&#xff0c;阅读了FAST-LIO、FAST-LIO2以及Faster_LIO论文&#xff0c;这三篇论文都属于滤波器的SLAM算法&#xff0c;下面记录一下三个工作的主要贡献和不同。 FAST-LIO 1.提出了一种计算效率高、鲁棒性强的激光雷达-惯性里程测量框架。使用紧密耦合的迭代扩展卡尔曼滤…

报错:/bin/sh: warning: setlocale: LC_ALL: cannot change locale (zh_CN.UTF-8)

解释&#xff1a;这是shell 警告你无法将当前的区域设置&#xff08;locale&#xff09;更改为 zh_CN.UTF-8&#xff0c;这个警告可能不会影响 fc-cache 命令的实际运行&#xff0c;但它确实表明系统在某些方面可能无法正确地处理与 zh_CN.UTF-8 相关的内容。 1.检查当前的区域…

2024年口腔护理市场行业未来前景预测:正畸护理用品市场行业分析报告

口腔护理是维护口腔健康的重要步骤&#xff0c;近年来&#xff0c;随着大众口腔健康意识的不断增强&#xff0c;人们对于口腔护理的消费意愿也不断增加&#xff0c;由此&#xff0c;口腔护理市场的市场规模也比较大。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;20…

OSCP靶场--Walla

OSCP靶场–Walla 考点(1.hydra http基本认证爆破&#xff1a; 2.sudo -l&#xff1a;python导入外部模块提权 3.Linux内核提权&#xff1a;cve-2021-4034) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.181.97 --min-rate 2000 Starting N…