
递归/回溯系列
文章平均质量分 89
递归/回溯系列面试题目
硕风和炜
硕风和炜,优快云官方Java领域优质创作者,阿里云社区专家博主,华为云云享专家,第十二届蓝桥杯JavaB组省1,保研,国家奖学金,JAVA开发技术栈,面试刷题,面经八股文,经验分享,好用的网站工具分享
展开
-
【LeetCode:132. 分割回文串 II + 动态规划】
【LeetCode:132. 分割回文串 II + 动态规划】给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文串。返回符合要求的 最少分割次数 。原创 2025-03-02 14:34:36 · 660 阅读 · 0 评论 -
【LeetCode: 887. 鸡蛋掉落 + 递归 + 二分 + dp】
【LeetCode: 887. 鸡蛋掉落 + 递归 + 二分 + dp】给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。请你计原创 2025-02-06 11:12:09 · 591 阅读 · 0 评论 -
【LeetCode: 40. 组合总和 II + 递归】
【LeetCode: 40. 组合总和 II + 递归】给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意:解集不能包含重复的组合。原创 2025-01-26 10:37:23 · 717 阅读 · 0 评论 -
【LeetCode: 695. 岛屿的最大面积 + DFS】
【LeetCode: 695. 岛屿的最大面积 + DFS】给你一个大小为 m x n 的二进制矩阵 grid 。岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。岛屿的面积是岛上值为 1 的单元格的数目。计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。原创 2025-01-07 11:03:51 · 538 阅读 · 0 评论 -
【LeetCode: 437. 路径总和 III + 二叉树 + 递归】
【LeetCode: 437. 路径总和 III + 二叉树 + 递归】给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。原创 2025-01-05 18:05:19 · 1529 阅读 · 0 评论 -
【LeetCode: 113. 路径总和 II + 二叉树 + 递归】
【LeetCode: 113. 路径总和 II + 二叉树 + 递归】给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。原创 2025-01-03 11:37:12 · 923 阅读 · 0 评论 -
【LeetCode:51. N 皇后 + DFS】
【LeetCode:51. N 皇后 + DFS】按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。原创 2024-12-01 15:24:53 · 921 阅读 · 0 评论 -
【LeetCode:91. 解码方法 + 递归 + 记忆化搜索 + 动态规划】
【LeetCode:91. 解码方法 + 递归 + 记忆化搜索 + 动态规划】一条包含字母 A-Z 的消息通过以下映射进行了 编码 :然而,在 解码 已编码的消息时,你意识到有许多不同的方式来解码,因为有些编码被包含在其它编码当中("2" 和 "5" 与 "25")。例如,"11106" 可以映射为:"AAJF" ,将消息分组为 (1, 1, 10, 6)"KJF" ,将消息分组为 (原创 2024-10-20 16:38:15 · 1064 阅读 · 0 评论 -
【LeetCode: 983. 最低票价 + 记忆化搜索】
【LeetCode: 983. 最低票价 + 记忆化搜索】在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。原创 2024-10-01 17:32:58 · 704 阅读 · 0 评论 -
【Leetcode:LCR 101. 分割等和子集 + 递归 + 记忆化搜索 + dp】
【Leetcode:LCR 101. 分割等和子集 + 递归 + 记忆化搜索 + dp】给定一个非空的正整数数组 nums ,请判断能否将这些数字分成元素和相等的两部分。原创 2024-09-07 17:52:15 · 1171 阅读 · 0 评论 -
【Leetcode:79. 单词搜索 + dfs】
【Leetcode:79. 单词搜索 + dfs】给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。原创 2024-08-27 21:43:45 · 944 阅读 · 0 评论 -
【Leetcode:543. 二叉树的直径 + 二叉树 + 递归 】
【Leetcode:543. 二叉树的直径 + 二叉树 + 递归 】给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。原创 2024-08-26 20:53:14 · 984 阅读 · 0 评论 -
【Leetcode:698. 划分为k个相等的子集 + 递归】
【Leetcode:698. 划分为k个相等的子集 + 递归】给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。原创 2024-08-25 11:30:06 · 817 阅读 · 0 评论 -
【Leetcode:93. 复原 IP 地址 + dfs】
【Leetcode:93. 复原 IP 地址 + dfs】有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中原创 2024-08-20 10:33:17 · 796 阅读 · 0 评论 -
【牛客:最长公共子串 + 递归 + 缓存 + 动态规划】
【牛客:最长公共子串 + 递归 + 缓存 + 动态规划】给定两个字符串str1和str2,输出两个字符串的最长公共子串题目保证str1和str2的最长公共子串存在且唯一。原创 2024-08-18 18:54:22 · 771 阅读 · 0 评论 -
【LeetCode:130. 被围绕的区域 + DFS】
【LeetCode:130. 被围绕的区域 + DFS】给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' 组成,捕获 所有 被围绕的区域:- 连接:一个单元格与水平或垂直方向上相邻的单元格连接。- 区域:连接所有 'O' 的单元格来形成一个区域。- 围绕:如果您可以用 'X' 单元格 连接这个区域,并且区域中没有任何单元格位于 board 边缘,则该区域被 'X' 单元格围绕。通过将输入矩阵 board 中的所有 'O' 替换为 'X' 来 捕获被围绕的区域。原创 2024-08-12 14:36:38 · 1005 阅读 · 0 评论 -
【LeetCode:1035. 不相交的线 + 动态规划】
【LeetCode:1035. 不相交的线 + 动态规划】最长公共子序列在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足: nums1[i] == nums2[j]且绘制的直线不与任何其他连线(非水平线)相交。请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。原创 2024-08-11 16:00:24 · 1430 阅读 · 0 评论 -
【LeetCode:3098. 求出所有子序列的能量和 + 记忆化缓存】
【LeetCode:3098. 求出所有子序列的能量和 + 记忆化缓存】给你一个长度为 n 的整数数组 nums 和一个 正 整数 k 。一个 子序列 的 能量 定义为子序列中 任意 两个元素的差值绝对值的 最小值 。请你返回 nums 中长度 等于 k 的 所有 子序列的 能量和 。由于答案可能会很大,将答案对 109 + 7 取余 后返回。原创 2024-07-23 12:33:59 · 1206 阅读 · 0 评论 -
【LeetCode:494. 目标和 + 递归】
【LeetCode:494. 目标和 + 递归】给你一个非负整数数组 nums 和一个整数 target 。向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。原创 2024-06-30 17:13:05 · 1288 阅读 · 0 评论 -
【LeetCode:2742. 给墙壁刷油漆 + 递归 + 记忆化搜索 + dp】
【LeetCode:2742. 给墙壁刷油漆 + 递归 + 记忆化搜索 + dp】给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time ,分别表示给 n 堵不同的墙刷油漆需要的开销和时间。你有两名油漆匠:- 一位需要 付费 的油漆匠,刷第 i 堵墙需要花费 time[i] 单位的时间,开销为 cost[i] 单位的钱。- 一位 免费 的油漆匠,刷 任意 一堵墙的时间为 1 单位,开销为 0 。但是必须在付费油漆匠 工作 时,免费油漆匠才会工作。请你返回刷完 n 堵墙最少开销为多少原创 2024-06-28 15:45:06 · 1040 阅读 · 0 评论 -
【LeetCode:2741. 特别的排列 + 递归 + 记忆化搜索 + 动态规划】
【LeetCode:2741. 特别的排列 + 递归 + 记忆化搜索 + 动态规划】给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数。如果 nums 的一个排列满足以下条件,我们称它是一个特别的排列:对于 0原创 2024-06-26 10:56:10 · 963 阅读 · 0 评论 -
【LeetCode:2786. 访问数组中的位置使分数最大 + 递归 + 记忆化缓存 + dp】
【LeetCode:2786. 访问数组中的位置使分数最大 + 递归 + 记忆化缓存 + dp】给你一个下标从 0 开始的整数数组 nums 和一个正整数 x 。你 一开始 在数组的位置 0 处,你可以按照下述规则访问数组中的其他位置:如果你当前在位置 i ,那么你可以移动到满足 i < j 的 任意 位置 j 。对于你访问的位置 i ,你可以获得分数 nums[i] 。如果你从位置 i 移动到位置 j 且 nums[i] 和 nums[j] 的 奇偶性 不同,那么你将失去分数 x 。请你返回原创 2024-06-14 10:53:00 · 709 阅读 · 0 评论 -
【LeetCode:3040. 相同分数的最大操作数目 II + 缓存】
【LeetCode:3040. 相同分数的最大操作数目 II + 缓存】给你一个整数数组 nums ,如果 nums 至少 包含 2 个元素,你可以执行以下操作中的 任意 一个:选择 nums 中最前面两个元素并且删除它们。选择 nums 中最后两个元素并且删除它们。选择 nums 中第一个和最后一个元素并且删除它们。一次操作的 分数 是被删除元素的和。在确保 所有操作分数相同 的前提下,请你求出 最多 能进行多少次操作。请你返回按照上述要求 最多 可以进行的操作次数。原创 2024-06-08 10:57:29 · 783 阅读 · 0 评论 -
【LeetCode:2928. 给小朋友们分糖果 I + 递归】
【LeetCode:2928. 给小朋友们分糖果 I + 递归】给你两个正整数 n 和 limit 。请你将 n 颗糖果分给 3 位小朋友,确保没有任何小朋友得到超过 limit 颗糖果,请你返回满足此条件下的 总方案数 。原创 2024-06-01 10:14:15 · 1347 阅读 · 0 评论 -
【LeetCode:1553. 吃掉 N 个橘子的最少天数 + 递归】
【LeetCode:1553. 吃掉 N 个橘子的最少天数 + 递归】厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子:吃掉一个橘子。如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子。如果剩余橘子数 n 能被 3 整除,那么你可以吃掉 2*(n/3) 个橘子。每天你只能从以上 3 种方案中选择一种方案。请你返回吃掉所有 n 个橘子的最少天数。原创 2024-05-12 17:15:34 · 1060 阅读 · 0 评论 -
【LeetCode:52. N 皇后 II + DFS】
【LeetCode:52. N 皇后 II + DFS】n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。原创 2024-05-06 14:03:47 · 698 阅读 · 0 评论 -
【LeetCode:377. 组合总和 Ⅳ + 递归 + 缓存】
【LeetCode:377. 组合总和 Ⅳ + 递归 + 缓存】给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。原创 2024-04-22 14:08:01 · 898 阅读 · 0 评论 -
【LeetCode:216. 组合总和 III + 递归】
【LeetCode:216. 组合总和 III + 递归】找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。原创 2024-04-21 10:08:23 · 1297 阅读 · 0 评论 -
【LeetCode: 39. 组合总和 + 递归】
【LeetCode: 39. 组合总和 + 递归】给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 对于给定的输入,保证和为 target 的不同组合数少于 150 个。原创 2024-04-20 12:57:24 · 828 阅读 · 0 评论 -
【LeetCode: 96. 不同的二叉搜索树 + 动态规划】
【LeetCode: 96. 不同的二叉搜索树 + 动态规划】给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。原创 2024-04-02 22:50:34 · 457 阅读 · 0 评论 -
【LeetCode: 994. 腐烂的橘子 + BFS】
【LeetCode: 994. 腐烂的橘子 + BFS】在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:- 值 0 代表空单元格;- 值 1 代表新鲜橘子;- 值 2 代表腐烂的橘子。每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。原创 2024-03-28 21:25:49 · 904 阅读 · 0 评论 -
【Acwing: 3508. 最长公共子串 + 动态规划】
【Acwing: 3508. 最长公共子串 + 动态规划】给定两个字符串,求这两个字符串的不包含数字的最长公共子串的长度。输入格式共两行,每行一个由小写字母和数字构成的字符串。输出格式一个整数,表示给定两个字符串的不包含数字的最长公共子串的长度。如果不存在满足要求的非空公共子串,则输出 0原创 2024-03-25 21:28:15 · 393 阅读 · 0 评论 -
【LeetCode: 120. 三角形最小路径和 + 动态规划】
【LeetCode: 120. 三角形最小路径和 + 动态规划】给定一个三角形 triangle ,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。原创 2024-03-23 20:44:48 · 908 阅读 · 0 评论 -
【LeetCode: 212. 单词搜索 II - dfs】
【LeetCode: 212. 单词搜索 II - dfs】给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。原创 2024-03-09 13:32:48 · 1168 阅读 · 0 评论 -
【LeetCode:17. 电话号码的字母组合 | 递归 + 回溯 + 组合】
【LeetCode:17. 电话号码的字母组合 | 递归 + 回溯 + 组合】给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。原创 2023-12-30 17:20:50 · 977 阅读 · 0 评论 -
【LeetCode:2698. 求一个整数的惩罚数 | 递归】
【LeetCode:2698. 求一个整数的惩罚数 | 递归】给你一个正整数 n ,请你返回 n 的 惩罚数 。n 的 惩罚数 定义为所有满足以下条件 i 的数的平方和:1原创 2023-10-25 15:11:59 · 213 阅读 · 0 评论 -
【LeetCode:1155. 掷骰子等于目标和的方法数 | 递归->缓存->dp】
【LeetCode:1155. 掷骰子等于目标和的方法数 | 递归->缓存->dp】这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k 。给定三个整数 n , k 和 target ,返回可能的方式(从总共 kn 种方式中)滚动骰子的数量,使正面朝上的数字之和等于 target 。答案可能很大,你需要对 109 + 7 取模 。原创 2023-10-24 12:37:03 · 650 阅读 · 0 评论 -
【LeetCode:1402. 做菜顺序 | 动态规划 + 贪心】
【LeetCode:1402. 做菜顺序 | 动态规划 + 贪心】一个厨师收集了他 n 道菜的满意程度 satisfaction ,这个厨师做出每道菜的时间都是 1 单位时间。一道菜的 「 like-time 系数 」定义为烹饪这道菜结束的时间(包含之前每道菜所花费的时间)乘以这道菜的满意程度,也就是 time[i]*satisfaction[i] 。返回厨师在准备了一定数量的菜肴后可以获得的最大 like-time 系数 总和。你可以按 任意 顺序安排做菜的顺序,你也可以选择放弃做某些菜来获得原创 2023-10-22 15:09:07 · 434 阅读 · 0 评论 -
【LeetCode: 2811. 判断是否能拆分数组】
LeetCode: 2811. 判断是否能拆分数组,给你一个长度为 n 的数组 nums 和一个整数 m 。请你判断能否执行一系列操作,将数组拆分成 n 个 非空 数组。在每一步操作中,你可以选择一个 长度至少为 2 的现有数组(之前步骤的结果) 并将其拆分成 2 个子数组,而得到的 每个 子数组,至少 需要满足以下条件之一:子数组的长度为 1 ,或者子数组元素之和 大于或等于 m 。如果你可以将给定数组拆分成 n 个满足要求的数组,返回 true ;否则,返回 false 。注意:子数组原创 2023-08-14 10:56:44 · 393 阅读 · 0 评论 -
【LeetCode: 931. 下降路径最小和 | 暴力递归=>记忆化搜索=>动态规划 】
LeetCode: 931. 下降路径最小和 | 暴力递归=>记忆化搜索=>动态规划 给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (ro原创 2023-07-13 10:15:21 · 572 阅读 · 1 评论