LeetCode 热题 HOT 100:回溯专题

LeetCode 热题 HOT 100:https://leetcode.cn/problem-list/2cktkvj/


文章目录

    • 17. 电话号码的字母组合
    • 22. 括号生成
    • 39. 组合总和
    • 46. 全排列
    • 补充:47. 全排列 II (待优化)
    • 78. 子集
    • 79. 单词搜索
    • 124. 二叉树中的最大路径和
    • 200. 岛屿数量
    • 437. 路径总和 III


17. 电话号码的字母组合

题目链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/?envType=featured-list&envId=2cktkvj?envType=featured-list&envId=2cktkvj

class Solution {List<String> list;Map<Character, String> map;public List<String> letterCombinations(String digits) {ap = new HashMap<>();res = new LinkedList<>();if(digits.length() == 0){return res;}map.put('2', "abc");map.put('3', "def");map.put('4', "ghi");map.put('5', "jkl");map.put('6', "mno");map.put('7', "pqrs");map.put('8', "tuv");map.put('9', "wxyz");backTrack(digits, 0, new StringBuilder());return list;}public void backTrack(String digits, int ind, StringBuilder sb){ // 参数:输入的字符串、字符串的索引、拼接的英文字符串if(digits.length() == ind){list.add(sb.toString());}else{char ch = digits.charAt(ind);String str = map.get(ch); // 获取按键下面的字符序列for (int i = 0; i < str.length(); i++) {sb.append(str.charAt(i));backTrack(digits, ind + 1, sb);sb.deleteCharAt(sb.length()-1); // 回溯}}}
}

参考题解:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/solutions/388738/dian-hua-hao-ma-de-zi-mu-zu-he-by-leetcode-solutio/?envType=featured-list&envId=2cktkvj?envType=featured-list&envId=2cktkvj

在这里插入图片描述


22. 括号生成

题目链接:https://leetcode.cn/problems/generate-parentheses/description/?envType=featured-list&envId=2cktkvj?envType=featured-list&envId=2cktkvj

思路一:

class Solution {List<String> res;public List<String> generateParenthesis(int n) {res = new LinkedList<>();backTrack(n, 0, 0, "");return res;}public void backTrack(int n, int left, int right, String str){if(left < right){return;}if(left == n && right == n){res.add(str);return;}else{if(left < n){backTrack(n, left+1, right, str+"(");}backTrack(n, left, right+1, str+")");}}
}

思路二:

class Solution {List<String> res = new ArrayList<>();public List<String> generateParenthesis(int n) {if(n<=0){return res;}getBracket("", n, n);return res;}public void getBracket(String str, int left, int right){if(left == 0 && right == 0){res.add(str);return;}if(left == right){getBracket(str+"(", left-1, right);}else{if(left > 0){getBracket(str+"(", left-1, right);}getBracket(str+")", left, right-1);}}
}

39. 组合总和

题目链接:https://leetcode.cn/problems/combination-sum/description/?envType=featured-list&envId=2cktkvj?envType=featured-list&envId=2cktkvj

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> list = new ArrayList<>();public List<List<Integer>> combinationSum(int[] candidates, int target) {dfs(candidates, target, 0);return res;}public void dfs(int[] candidates, int target, int ind){ // 关键点在于索引if(target == 0){res.add(new ArrayList<>(list));return;}for(int i = ind; i < candidates.length; i ++){if(target - candidates[i] >= 0){list.add(candidates[i]);dfs(candidates, target - candidates[i], i); // 每次在当前的索引上进行遍历,作用在于:如果没有索引:target=5,5-3-2 作用等同于 5-2-3, 那么会有两种组合[2,3]与[3,2]// 但是在索引的约束下,不会出现这种情况 list.remove(list.size()-1);}}}
}

参考链接:https://leetcode.cn/problems/combination-sum/solutions/14697/hui-su-suan-fa-jian-zhi-python-dai-ma-java-dai-m-2/?envType=featured-list&envId=2cktkvj?envType=featured-list&envId=2cktkvj
在这里插入图片描述


46. 全排列

题目链接:https://leetcode.cn/problems/permutations/description/?envType=featured-list&envId=2cktkvj?envType=featured-list&envId=2cktkvj

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> list = new ArrayList<>();public List<List<Integer>> permute(int[] nums) {boolean[] visited = new boolean[nums.length]; // 标志数组dfs(nums, 0, visited);return res;}public void dfs(int[] nums, int size, boolean[] visited){if(size == nums.length){res.add(new ArrayList<>(list));return;}for(int i = 0; i < nums.length; i ++){if(!visited[i]){visited[i] = true;list.add(nums[i]);dfs(nums, size+1, visited);list.remove(list.size()-1); // 回溯visited[i] = false;}}}
}

参考链接:https://leetcode.cn/problems/permutations/solutions/9914/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liweiw/?envType=featured-list&envId=2cktkvj?envType=featured-list&envId=2cktkvj

在这里插入图片描述


补充:47. 全排列 II (待优化)

题目链接:https://leetcode.cn/problems/permutations-ii/description/?envType=featured-list&envId=2cktkvj%3FenvType%3Dfeatured-list&envId=2cktkvj

class Solution {List<List<Integer>> res = new LinkedList<>();List<Integer> list = new LinkedList<>();public List<List<Integer>> permuteUnique(int[] nums) {boolean[] visited = new boolean[nums.length]; // 标志数组dfs(nums, 0, visited);return res;}public void dfs(int[] nums, int size, boolean[] visited){if(size == nums.length){for (List<Integer> result : res) {if(result.equals(list)){return;}}res.add(new ArrayList<>(list));return;}for(int i = 0; i < nums.length; i ++){if(!visited[i]){visited[i] = true;list.add(nums[i]);dfs(nums, size+1, visited);list.remove(list.size()-1);visited[i] = false;}}}
}

78. 子集

题目链接:https://leetcode.cn/problems/subsets/description/?envType=featured-list&envId=2cktkvj?envType=featured-list&envId=2cktkvj

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> list = new ArrayList<>();public List<List<Integer>> subsets(int[] nums) {dfs(nums, 0);return res;}public void dfs(int[] nums, int i){if(i==nums.length){res.add(new ArrayList(list));return;}// 选 nums[i]list.add(nums[i]);dfs(nums, i+1);// 不选 nums[i]list.remove(list.size()-1);dfs(nums, i+1);}
}

在这里插入图片描述


79. 单词搜索

题目链接:https://leetcode.cn/problems/word-search/description/?envType=featured-list&envId=2cktkvj?envType=featured-list&envId=2cktkvj

class Solution {public boolean exist(char[][] board, String word) {for(int i = 0; i < board.length; i ++){for(int j = 0; j < board[0].length; j ++){if(board[i][j] == word.charAt(0)){if(dfs(board, i, j, word, 0)){ // 路径开头不一定只有一处,所以要遍历整个数组return true;}}}}return false;}public boolean dfs(char[][] board, int i, int j, String word, int ind){if(ind >= word.length()){return true;}if(i>=0 && i<board.length && j>=0 && j<board[0].length && board[i][j]==word.charAt(ind) && board[i][j]!='\0'){ // 剪枝char tmp = board[i][j];board[i][j] = '\0'; // 设置不可访问boolean f1 = dfs(board, i, j-1, word, ind+1); // 左boolean f2 = dfs(board, i-1, j, word, ind+1); // 上boolean f3 = dfs(board, i, j+1, word, ind+1); // 右boolean f4 = dfs(board, i+1, j, word, ind+1); // 下board[i][j] = tmp; // 回溯return f1 || f2 || f3 ||f4;}return false;}
}

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

题目链接:https://leetcode.cn/problems/binary-tree-maximum-path-sum/description/?envType=featured-list&envId=2cktkvj?envType=featured-list&envId=2cktkvj

  • 二叉树 abc,a 是根结点(递归中的 root),bc 是左右子结点(代表其递归后的最优解)。最大的路径,可能的路径情况:
       a
    /  \
      b    c
    ① b + a + c。
    ② b + a + a 的父结点。(需要再次递归)
    ③ a + c + a 的父结点。(需要再次递归)
  • 其中情况 1,表示如果不联络父结点的情况,或本身是根结点的情况。这种情况是没法递归的,但是结果有可能是全局最大路径和,因此可以在递归过程中通过比较得出。
  • 情况 2 和 3,递归时计算 a+b 和 a+c,选择一个更优的方案返回,也就是上面说的递归后的最优解。
class Solution {int max = Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {if(root == null){return 0;}dfs(root);return max;}/*** 返回经过root的单边分支最大和, 即 Math.max(root, root+left, root+right)*/public int dfs(TreeNode root){if(root == null){return 0;}// 计算左子树最大值,左边分支如果为负数还不如不选择int leftMax = Math.max(0, dfs(root.left));// 计算右子树最大值,右边分支如果为负数还不如不选择int rightMax = Math.max(0, dfs(root.right));// left->root->right 作为路径与已经计算过历史最大值做比较max = Math.max(max, leftMax + root.val + rightMax);// 返回经过root的单边最大分支给当前root的父节点计算使用return root.val + Math.max(leftMax, rightMax);}
}

200. 岛屿数量

题目链接:https://leetcode.cn/problems/number-of-islands/description/?envType=featured-list&envId=2cktkvj?envType=featured-list&envId=2cktkvj

class Solution {public int numIslands(char[][] grid) {int sum = 0;for(int i = 0; i < grid.length; i ++){for(int j = 0; j < grid[0].length; j ++){if(grid[i][j] == '1'){dfs(grid, i, j);sum++;}}}return sum;}public void dfs(char[][] grid, int x, int y){if(0<=x && x<grid.length && 0<=y && y<grid[0].length && grid[x][y] == '1'){grid[x][y] ='0';dfs(grid, x, y-1); // 左dfs(grid, x-1, y); // 上dfs(grid, x, y+1); // 右dfs(grid, x+1, y); // 下}}
}

437. 路径总和 III

题目链接:https://leetcode.cn/problems/path-sum-iii/description/?envType=featured-list&envId=2cktkvj?envType=featured-list&envId=2cktkvj

class Solution {// key 是前缀和,value 是前缀和为这个值的路径数量。Map<Long, Integer> map = new HashMap<>();int target;public int pathSum(TreeNode root, int targetSum) {this.target = targetSum;// 可能路径从根节点开始算map.put(0l, 1);return dfs(root, 0l);}public int dfs(TreeNode root, long curSum){if(root == null){return 0;}curSum += root.val; // 当前累计的结点值int res = 0;// 以当前节点为止,去查看从前的 map 集合中是否还存在目标前缀和//              1//             ///            2//           ///          3// 假设目标和为 5// 节点 1 的前缀和为:1// 节点 3 的前缀和为: 1+2+3 = 6// pre(3) - pre(1) = 5// 所以从节点 1 到节点 3 之间有一条符合要求的路径res += map.getOrDefault(curSum-target, 0);// 存储路径的原因是可能节点的前缀和存在相等的情况://              2//             ///            0//           ///          4// 从节点 2 到节点 4 有两条路径长度等于2map.put(curSum, map.getOrDefault(curSum, 0) + 1);int left = dfs(root.left, curSum); // 调用左子树int right = dfs(root.right, curSum); // 调用右子树res = res + left + right;map.put(curSum, map.get(curSum)-1); // 恢复状态return res;}
}

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

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

相关文章

手机电脑数码小程序商城的作用是什么

手机几乎是每个成年人人手一个以上&#xff0c;市场非常大&#xff0c;加之产品更新迭代速度快&#xff0c;每年都会推出多个型号、造型等&#xff0c;因此对高收入群体或爱机人群来说&#xff0c;新手机往往一年或二年时间就会换&#xff0c;或者直接购买当备用机等。 每个城…

关于解决 unable to start ssh-agent service, error :1058

前言 操作系统&#xff1a;win11 命令终端&#xff1a;Powershell 当我在终端输入命令 启动 ssh-agent 代理的时候 ssh-agent -s 很不幸出现了 unable to start ssh-agent service, error :1058以下错误 问题的解决 查看我们ssh-agent 服务是否运行&#xff0c;执行如下命令…

快看看你的手机有没有:谷歌Android全面封杀此类软件!

谷歌坐不住了&#xff0c;因为Android应用商店中&#xff0c;充斥着大量可窃取用户数据的应用&#xff0c;所以必然要出手整治了。 一款名叫“SonicSpy”软件是整个事情的导火索&#xff0c;而该应用是典型的窃取用户数据的应用&#xff0c;其除了可以从手机中提取个人数据外&…

C++ 学习系列 -- std::stack 与 std::queue

一 std::stack 与 std::queue 分别是什么&#xff1f; 两者均是 c 中的序列化容器&#xff0c;区别在于&#xff1a; std::stack 元素是先进后出 std::queue 元素是先进先出 二 std::stack 与 std::queue 原理 1 std:statck 2. std::queue 两者底层容器可以是 list 也可以…

黑豹程序员-架构师学习路线图-百科:HTML-网页三剑客

为什么需要HTML 在网站技术发达之前&#xff0c;千年来我们获取信息是通过书籍。电脑流行后我们看文章、小说通过txt文件。看图通过单独的图片流量工具看单个的图片文件。 而HTML把文字和图片一起展示&#xff0c;让今天的电子书成为可能。 另外一点&#xff0c;我们的信息是…

蜂蜜配送销售商城小程序的作用是什么

蜂蜜是农产品中重要的一个类目&#xff0c;其受众之广市场需求量大&#xff0c;但由于非人人必需品&#xff0c;因此传统线下门店经营也面临着痛点&#xff0c;线上入驻平台也有很多限制难以打造自有品牌&#xff0c;无法管理销售商品及会员、营销等&#xff0c;缺少自营渠道&a…

Linux常见操作命令(1)

​ 前言&#xff1a;作者也是初学Linux&#xff0c;可能总结的还不是很到位 ♈️今日夜电波&#xff1a;达尔文—林俊杰 0:30━━━━━━️&#x1f49f;──────── 4:06 &#x1f504; ◀️ …

集合在多线程下安全问题

如果在多线程下&#xff0c;同时操作同一个数据源&#xff0c;就会出现数据安全问题&#xff1a; A线程取出值为10&#xff0c;准备加5. 同时B线程也取出来10&#xff0c;减了5 C取出的时候有可能时15&#xff0c;也有可能时5。产生了数据安全问题。 方法有很多例如&#xff1a…

Acwing 143. 最大异或对

Acwing 143. 最大异或对 题目描述思路讲解代码展示 题目描述 思路讲解 这道题的启示是&#xff1a;字典树不单单可以高效存储和查找字符串集合,还可以存储二进制数字 思路:将每个数以二进制方式存入字典树,找的时候从最高位去找有无该位的异. 代码展示 #include<iostream…

uboot启动流程-涉及_main汇编函数

一. uboot启动流程涉及函数 本文简单分析一下 save_boot_params_ret调用的函数&#xff1a;_main汇编函数。 本文继之前文章的学习&#xff0c;地址如下&#xff1a; uboot启动流程-涉及s_init汇编函数_凌肖战的博客-CSDN博客 二. uboot启动流程涉及的 _main汇编函数 经过之…

鞋类 整鞋试验方法 剥离强度

声明 本文是学习GB-T 3903.3-2011 鞋类 整鞋试验方法 剥离强度. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 GB/T 3903 的本部分规定了整鞋鞋底与鞋帮或外底与外中底之间剥离强度的试验方法。 本部分适用于采用模压、硫化、注塑、灌注、胶…

Springboot对MVC、tomcat扩展配置

Springboot在web层的开发基本都是采用Springmvc框架技术&#xff0c;但是Springmvc中的某些配置在boot是没有的&#xff0c;我们就应该根据自己的需求进行对mvc扩展配置 Springboot1.x版本如何配置 通过注解Configuration一个类&#xff0c;继承webmvcconfigureradapter&#…

macOS 14 Sonoma 如何删除不需要的 4k 动态壁纸

概览 在升级到 macOS 14&#xff08;Sonoma&#xff09;之后&#xff0c;小伙伴们惊喜发现  提供了诸多高清&#xff08;4k&#xff09;动态壁纸的支持。 现在&#xff0c;从锁屏到解锁进入桌面动态到静态的切换一气呵成、无比丝滑。 壁纸显现可谓是有了“天水相连为一色&…

【SpringBoot学习】收藏的学习资料,精!

文章目录 Spring实战&#xff08;第五版&#xff09;&#xff1a; https://potoyang.gitbook.io/spring-in-action-v5/di-er-bu-fen-ji-cheng-spring南京大学-软件体系架构,结合SpringBoot Spring实战&#xff08;第五版&#xff09;&#xff1a; https://potoyang.gitbook.io/…

【农业生产模拟】WOFOST模型与PCSE模型实践

查看原文>>>【农业生产模拟】WOFOST模型与PCSE模型实践 WOFOST&#xff08;WorldFoodStudies&#xff09;和PCSE&#xff08;PythonCropSimulationEnvironment&#xff09;是两个用于农业生产模拟的模型&#xff1a;WOFOST是一个经过多年开发和验证的模型&#xff0c…

ElementUI之增删改及表单验证

⭐⭐本文章收录与ElementUI原创专栏&#xff1a;ElementUI专栏 ⭐⭐ ElementUI的官网&#xff1a;ElementUI官网 目录 一.前言 二.使用ElementUI完成增删改 2.1 后台代码 2.2 前端代码 三.使用ElementUI完成表单验证 一.前言 本章是继上一篇的基础之上在做完善&#xff0…

多网卡场景数据包接收时ip匹配规则

多网卡场景数据包接收时ip匹配规则 mac地址匹配规则 接收数据包时数据包中的目的mac地址匹配接收网卡的mac地址后&#xff0c;数据包才会继续被传递到网络层处理 ip地址匹配规则 图1&#xff1a; 参见&#xff1a;https://zhuanlan.zhihu.com/p/529160026?utm_id0 图2&am…

Python 接口测试之接口关键字封装

引言 我们使用RF做UI自动化测试的时候&#xff0c;使用的是关键字驱动。同样&#xff0c;Python做接口自动化测试的时候&#xff0c;也可以使用关键字驱动。但是这里并不是叫关键字驱动&#xff0c;而是叫数据驱动。而接口测试的关键字是什么呢&#xff1f; 我们数据驱动的载体…

IDEA 配置 Maven(解决依赖下载缓慢)

IDEA 配置 Maven&#xff08;解决依赖下载缓慢&#xff09; 这一篇主要介绍 Maven 的基本用法。等我之后学习到框架知识时&#xff0c;会完善此部分内容。 一、Maven 简介 Maven 是专门用于管理和构建 Java 项目的工具&#xff0c;Apache Maven 是一个项目管理和构建工具&#…

掌动智能:替代JMeter的压力测试工具有哪些

JMeter是一个广泛使用的开源压力测试工具&#xff0c;但在实际应用中&#xff0c;也有一些其他优秀的替代品可供选择。本文将介绍几个可替代JMeter的压力测试工具&#xff0c;它们在功能、性能和易用性方面都具有独特优势&#xff0c;可以满足不同压力测试需求的选择。 一、Gat…