小工具知识网

当前位置: 首页 > 行业知识 > 【寸铁的刷题笔记】树、回溯、图论、bfs、dfs(四)

行业知识

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

2026-11-09 19:55:09 来源:互联网转载

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

大家好 ���是寸铁

()

金三银四,图论基础、回溯结合bfs、dfs是必考的知识点✨

快跟着寸铁刷起来!面试顺利上岸

()

喜欢的小伙伴可以点点关注


详见如下专栏

寸铁的刷题笔记


17. 电话号码的字母组合

考点

dfs、回溯


代码

class Solution {    //创建一个列表,用于存储组合的结果    Listlist = new ArrayList();    public List letterCombinations(String digits) {        //如果说digits字符串为空或者长度为0        //则说明没有任何可以组合的字符,直接返回空列表即可。        if(digits == null || digits.length() == 0)return list;        //使用数组存储一个映射,也可以使用map存储        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  

77. 组合

考点

dfs、回溯


代码

class Solution {    Listresult = new ArrayList();    LinkedListpath = new LinkedList();    //可以删除最后一个元素 removeLast()    //再转为ArrayList()    public List 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             //添加元素            path.add(i);            //递归到下一层 注意: 起始数字从 i + 1开始,确保数字组合不重复。            //每次递归时,都从上一个数字的下一个数开始,这样就不会导致组合出现重复。            combineHelper(n , k , i + 1);            //向上回溯            path.removeLast();        }    }}    /*    bfs暴搜    用一个Map存储单词列表,后面用于匹配单词使用。    暴力搜索单词长度下的字母每一位的26种可能,再去与单词列表进行匹配,匹配成功则标记该单词已经走过。    同时,单词序列的长度(bfs搜索的层数)++,单词入队,用于下一轮的搜索。    最后,判断能否走到最后一个单词,也就是当搜索时匹配到最后一个单词时,搜索停止,返回走过的序列长度。    如何确保转换序列最短?    这里我们是一层层搜索,每一层优先去匹配最后单词。    如果说匹配的上,则返回序列长度。    如果说匹配不上,则把当前搜索的节点入队,用于下一层的继续搜索。    */    public int ladderLength(String beginWord, String endWord, List        //如果说开头的单词的长度与最后一个单词的长度不同,则不存在这样的转换序列。        if(beginWord.length() != endWord.length())return 0;        int n = beginWord.length();        //创建一个单词库,用于后面的单词匹配。        Set            wordsLib.add(word);        }        //如果说终点单词不在单词库中则不存在这样的转换序列。        if(!wordsLib.contains(endWord))return 0;        //宽搜        //创建标记Set记录已经走过的节点        Set            //弹出当前队列的节点进行宽搜            Node cur = queue.poll();            String curWord = cur.word;//记录弹出节点的单词            int cnt = cur.cnt; //记录弹出节点的单词长度            //每次弹出一个单词,序列的长度就++            //因为要往下一层搜索,是一层层搜索,如果最后找到,则返回找到的序列长度即可            //找不到则返回0             cnt++; //bfs搜索的层数(序列长度)加1            System.out.println(curWord);            System.out.println(cnt);//a -- c             //暴力搜索             //注意:这个搜索的话,是一层层搜。             //每次搜索时,会优先考虑是否与最后一个单词匹配,确保序列长度是最短的。             //如果匹配上,则直接返回序列长度即可,此时的序列长度为最短             //如果没有匹配,则先把这一层搜索到的节点入队,用于下一层搜索。            for(int i = 0 ; i  

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;        //把每次计算的结果取一个max        maxSum = Math.max(maxSum , priceNewPath);        //返回一条较大路径 给上层节点继续计算路径和        return node.val + Math.max(leftGain , rightGain);    }}

98. 验证二叉搜索树

考点

DFS、双指针、回溯

与 530. 二叉搜索树的最小绝对差的处理逻辑类似

思路

思想:根据定义,节点的左子树小于当前节点,节点的右子树大于当前节点

也就是left

很自然的就想到了用中序遍历,再判断一下是否满足left

进一步,我们只需要判断当前的节点是否小于之前的节点。

如果小于则不满足条件,向上返回false即可。

否则,则满足条件。


代码

class Solution {    /*    思想:根据定义,节点的左子树小于当前节点,节点的右子树大于当前节点    也就是left 

上一篇:宝塔面板采集怎么用?

下一篇:代号破晓服务器怎么进不去?