leetcode题
leetcode题
海螺蜜
这个作者很懒,什么都没留下…
展开
-
LeetCode-动规-最长递增子序列、最长连续递增序列、最长重复子数组、最长公共子序列、不相交的线、最大子数组和、判断子序列、不同的子序列、两个字符串的删除操作、编辑距离、回文子串、最长回文子序列
最长递增子序列最长连续递增序列最长重复子数组最长公共子序列不相交的线最大子数组和判断子序列不同的子序列两个字符串的删除操作编辑距离回文子串最长回文子序列原创 2022-07-11 10:28:08 · 350 阅读 · 2 评论 -
LeetCode(C++)-动态规划(股票问题)
121. 买卖股票的最佳时机122. 买卖股票的最佳时机 II123. 买卖股票的最佳时机 III188. 买卖股票的最佳时机 IV309. 最佳买卖股票时机含冷冻期714. 买卖股票的最佳时机含手续费原创 2022-07-09 10:41:55 · 530 阅读 · 0 评论 -
LeetCode(C++)-动态规划(打家劫舍、打家劫舍II、打家劫舍III)
198. 打家劫舍213. 打家劫舍 II337. 打家劫舍 III原创 2022-07-06 09:51:11 · 636 阅读 · 0 评论 -
LeetCode(C++)-动态规划-完全背包(零钱兑换 II、组合总和 Ⅳ、零钱兑换、完全平方数、单词拆分)
518. 零钱兑换 II377. 组合总和 Ⅳ322. 零钱兑换279. 完全平方数139. 单词拆分原创 2022-07-05 11:29:21 · 145 阅读 · 0 评论 -
LeetCode(C++)-动态规划(分割等和子集、最后一块石头的重量II、目标和、一和零)
416. 分割等和子集1049. 最后一块石头的重量II494. 目标和474. 一和零原创 2022-07-04 21:45:41 · 299 阅读 · 0 评论 -
LeetCode(C++)-动态规划(使用最小花费爬楼梯、不同路径、不同路径 II、整数拆分、不同的二叉搜索树)
746. 使用最小花费爬楼梯62. 不同路径63. 不同路径 II343. 整数拆分96. 不同的二叉搜索树原创 2022-07-04 10:49:59 · 442 阅读 · 0 评论 -
LeetCode-动态规划(斐波那契数、爬楼梯)
动态规划五部曲:1. 确定dp数组以及下标的含义2. 确定递推公式3. dp数组如何初始化4. 确定遍历顺序5. 举例推导dp数组509. 斐波那契数70. 爬楼梯原创 2022-07-02 19:54:01 · 94 阅读 · 0 评论 -
LeetCode(C++)-贪心算法(用最少数量的箭引爆气球、无重叠区间、划分字母区间、合并区间、买卖股票的最佳时机含手续费、单调递增的数字、监控二叉树)
452. 用最少数量的箭引爆气球435. 无重叠区间763. 划分字母区间56. 合并区间738. 单调递增的数字714. 买卖股票的最佳时机含手续费968. 监控二叉树原创 2022-07-01 21:00:47 · 499 阅读 · 0 评论 -
LeetCode(C++)-贪心算法(加油站、分发糖果、柠檬水找零、根据身高重建队列)
134. 加油站135. 分发糖果860. 柠檬水找零406. 根据身高重建队列原创 2022-06-30 19:36:23 · 434 阅读 · 0 评论 -
LeetCode-贪心算法(分发饼干、摆动序列、最大子数组和、买卖股票的最佳时机 II、跳跃游戏、跳跃游戏 II、K 次取反后最大化的数组和)
455. 分发饼干376. 摆动序列53. 最大子数组和122. 买卖股票的最佳时机 II55. 跳跃游戏45. 跳跃游戏 II1005. K 次取反后最大化的数组和原创 2022-06-29 17:24:58 · 712 阅读 · 0 评论 -
LeetCode-解数独(C++)
编写一个程序,通过填充空格来解决数独问题。数独的解法需 遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)数独部分空格内已填入了数字,空白格用 ‘.’ 表示。示例 1:输入:board = [[“5”,“3”,“.”,“.”,“7”,“.”,“.”,“.”,“.”],[“6”,“.”,“.”,“1”,“9”,“5”,“.”,“.”,“.”],[“.”,“9”,“8”,“.”,“.”,“原创 2022-06-28 19:44:01 · 712 阅读 · 0 评论 -
LeetCode-N 皇后(C++)
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。示例 1:输入:n = 4输出:[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]解释:如上图所示,4 皇后问题存原创 2022-06-28 18:34:11 · 382 阅读 · 0 评论 -
LeetCode-重新安排行程(C++)
给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。例如,行程 [“JFK”, “LGA”] 与 [“JFK”, “LGB”] 相比就更小,排序更靠前。假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。示例 1:输入:ti原创 2022-06-28 16:24:05 · 481 阅读 · 0 评论 -
LeetCode-全排列 II(C++)
47. 全排列 II给定一个可包含重复数字的序列 nums ,按任意顺序返回所有不重复的全排列。示例 1:输入:nums = [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]这道题在全排列的基础上更进一步,多了一步去重,如下图所示。先给数组排好序,在树的同一层,如果它的前一个元素值与它相同,则当前元素不继续往下遍历,跳过该元素。我们可以定义一个used数组,标识元素是在同一树枝使用过,还是在同一树层使用过,used[i]=true表示同一树枝使用过,used[i]=fal原创 2022-06-28 10:05:27 · 250 阅读 · 0 评论 -
LeetCode-全排列(C++)
46. 全排列给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例 1:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]思路:本题使用回溯算法,如下图所示,第一层取1,剩余元素{2,3},第二层在剩余元素里取2,剩下3,然后取3,得到第一个排列。可以看出跟之前组合问题是不一样的,组合问题会用到startIndex标识起始位置,而排列问题是无法标识的,因为每一个元原创 2022-06-27 22:10:35 · 713 阅读 · 0 评论 -
LeetCode-递增子序列(C++)
491. 递增子序列给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。示例 1:输入:nums = [4,6,7,7]输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]思路:本题使用回溯算法,分析题目可知,本题需要找递增子序列,所以不能对数组进行排序。另外,数组中含有重复原创 2022-06-27 16:39:15 · 707 阅读 · 0 评论 -
LeetCode-子集 II(C++)
90. 子集 II给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。示例 1:输入:nums = [1,2,2]输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]思路:本题是在子集的基础上更进一步,本题要求不能包含重复的子集,这个去重思路是与组合总和II相同。所以如果理解了前面这两道题,这道题就非常容易了。本题用的去重方法和组合总和II中使用used数组去重的方法不一样。本题原创 2022-06-27 15:02:13 · 255 阅读 · 0 评论 -
LeetCode-子集(C++)
78. 子集给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]思路:本题使用回溯算法,for循环横向遍历,递归纵向遍历,把它想象成树状结构,收集每一个节点值。定义全局变量result为结果集,path为收集到的子集。因为把result.push_back(path);写到了p原创 2022-06-27 11:39:20 · 314 阅读 · 0 评论 -
LeetCode-复原 IP 地址(C++)
93. 复原 IP 地址有效 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 中插入 ‘.’ 来形成。你 不能 重新排原创 2022-06-27 10:45:47 · 533 阅读 · 0 评论 -
LeetCode-分割回文串(C++)
131. 分割回文串给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。示例 1:输入:s = “aab”输出:[[“a”,“a”,“b”],[“aa”,“b”]]思路:本题用回溯算法,具体可参考代码随想录。首先定义全局变量result为结果集,path保存切割好的回文子串。对于示例1,for循环横向遍历,在aab中先截取a,然后截取aa,然后aab。递归纵向遍历,在截取a的下面在截取a,截取ab;在截取aa的下原创 2022-06-26 11:48:40 · 847 阅读 · 1 评论 -
LeetCode-组合总和 II
40. 组合总和 II给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意:解集不能包含重复的组合。示例 1:输入: candidates = [10,1,2,7,6,1,5], target = 8,输出:[[1,1,6],[1,2,5],[1,7],[2,6]]思路:本题使用回溯算法,首先定义全局变量result为结果集,pa原创 2022-06-26 10:12:14 · 249 阅读 · 0 评论 -
LeetCode-组合总和(C++)
39. 组合总和给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target 的不同组合数少于 150 个。示例 1:输入:candidates = [2,3,6,7], target原创 2022-06-25 16:44:12 · 496 阅读 · 0 评论 -
LeetCode-电话号码的字母组合(C++)
17. 电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例 1:输入:digits = “23”输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]思路:用回溯算法,首先定义一个数字到字母的映射letterMap,然后定义两个全局变量,result表示结果集,path表示收集到的字母组合。确定回溯函数的参数,数字组合dig原创 2022-06-25 15:38:24 · 355 阅读 · 0 评论 -
LeetCode-组合总和 III(C++)
216. 组合总和 III找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:只使用数字1到9每个数字 最多使用一次返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。示例 1:输入: k = 3, n = 7输出: [[1,2,4]]解释:1 + 2 + 4 = 7没有其他符合的组合了。思路:用回溯算法,定义全局变量result为结果集,path为每次搜索的路径,sum为每次搜索路径的和。然后回溯三部曲,参数列表为n,k和起始搜索startInd原创 2022-06-25 11:42:35 · 478 阅读 · 0 评论 -
LeetCode题-组合(C++)
77. 组合给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。示例 1:输入:n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]思路:这道题可以用回溯算法,回溯法的搜索过程就是一个树型结构的遍历过程,for循环用来横向遍历,递归的过程是纵向遍历。代码:参考资料:代码随想录...原创 2022-06-25 09:54:51 · 280 阅读 · 0 评论 -
把二叉搜索树转换为累加树(C++)
538. 把二叉搜索树转换为累加树给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。提醒一下,二叉搜索树满足下列约束条件:节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。思路:仔细观察示例1,发现累加树是将二叉搜索树中序遍历数组反序,然后逐渐累加,也就是这道题其实是反的中序遍历(右中左),然后当前节点的值原创 2022-06-24 16:08:57 · 91 阅读 · 0 评论 -
将有序数组转换为二叉搜索树(C++)
108. 将有序数组转换为二叉搜索树给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。示例 1:输入:nums = [-10,-3,0,5,9]输出:[0,-3,9,-10,null,5]解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案思路:每次用数组中间元素去建立一个新的节点,然后root->left等于数组左半部分区间的中间值,ro原创 2022-06-23 20:12:03 · 407 阅读 · 0 评论 -
修剪二叉搜索树(C++)
669. 修剪二叉搜索树给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。示例 1:输入:root = [1,0,2], low = 1, high = 2输出:[1,null,2]思路:原创 2022-06-23 19:41:29 · 124 阅读 · 0 评论 -
删除二叉搜索树中的节点(C++)
450. 删除二叉搜索树中的节点给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。示例 1:输入:root = [5,3,6,2,4,null,7], key = 3输出:[5,4,6,2,null,null,7]解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。思路:递归查找原创 2022-06-23 16:18:27 · 485 阅读 · 0 评论 -
二叉搜索树中的插入操作(C++)
701. 二叉搜索树中的插入操作给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。示例 1:输入:root = [4,2,7,1,3], val = 5输出:[4,2,7,1,3,5]思路:递归查找适合的位置,找到空节点就插入。代码:...原创 2022-06-22 15:56:36 · 498 阅读 · 0 评论 -
二叉搜索树的最近公共祖先(C++)
235. 二叉搜索树的最近公共祖先给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]示例 1:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出:原创 2022-06-22 15:12:31 · 365 阅读 · 0 评论 -
二叉树的最近公共祖先(C++)
236. 二叉树的最近公共祖先给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3 。思路:用后序遍历的方法,自底向上去遍历二叉树,遇原创 2022-06-21 22:25:53 · 820 阅读 · 0 评论 -
二叉搜索树中的众数(C++)
501. 二叉搜索树中的众数给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。如果树中有不止一个众数,可以按 任意顺序 返回。假定 BST 满足如下定义:结点左子树中所含节点的值 小于等于 当前节点的值结点右子树中所含节点的值 大于等于 当前节点的值左子树和右子树都是二叉搜索树示例 1:输入:root = [1,null,2,2]输出:[2]思路:二叉搜索树,中序遍历是有序的,所以中序遍历二叉树,相同的值一定相邻,如果当前节点与原创 2022-06-20 22:06:03 · 187 阅读 · 0 评论 -
二叉搜索树的最小绝对差(C++)
530. 二叉搜索树的最小绝对差给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。差值是一个正数,其数值等于两值之差的绝对值。示例 1:输入:root = [4,2,6,1,3]输出:1思路:利用二叉搜索树中序遍历有序的特性,用中序遍历当前值减去前一个值,找到最小的即可。方法一:递归法方法二:迭代法参考资料:代码随想录...原创 2022-06-20 19:44:12 · 128 阅读 · 0 评论 -
验证二叉搜索树(C++)
98. 验证二叉搜索树给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:方法一:递归遍历每一个节点,判断当前节点的左子树的节点值是否都小于该节点值,右子树的节点值是否都大于该节点值。1. 确定递归函数的参数以及返回值:参数为根节点,返回值为bool类型。2. 确定终止条件:如果当前节点为空,返回true。3. 确定单原创 2022-06-20 16:42:08 · 625 阅读 · 0 评论 -
二叉搜索树中的搜索(C++)
思路:递归搜索二叉树。1. 确定递归函数返回值和参数列表:返回值为节点值等于val的节点,参数列表为根节点和要搜索的val值。2. 确定终止条件:如果当前节点为空或者找到了要搜索的节点,就返回该节点。3. 确定单层递归逻辑:如果当前节点值大于要搜索的值,就搜索左子树;如果小于要搜索的值,就搜索右子树。如果左右子树找不到该值,返回空。...原创 2022-06-19 17:09:18 · 74 阅读 · 0 评论 -
合并二叉树(C++)
617. 合并二叉树给你两棵二叉树: root1 和 root2 。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。注意: 合并过程必须从两个树的根节点开始。示例 1:输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]输出:[3原创 2022-06-19 16:36:16 · 599 阅读 · 0 评论 -
最大二叉树(C++)
654. 最大二叉树给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。返回 nums 构建的 最大二叉树 。示例 1:输入:nums = [3,2,1,6,0,5]输出:[6,3,5,null,2,0,null,null,1]解释:递归调用如下所示:示例 2:输入:nums = [3,2,1]输出原创 2022-06-19 15:44:18 · 618 阅读 · 0 评论 -
从中序与后序遍历序列构造二叉树
106. 从中序与后序遍历序列构造二叉树示例思路:后序数组最后一个值是当前的中间节点,以后序数组的最后一个值对中序数组进行分割,分成左子树(左中序数组),右子树(右中序数组)。对于后序数组,先去掉最后一个元素,然后根据左中序数组的大小对后序数组...原创 2022-06-19 15:02:50 · 2042 阅读 · 0 评论 -
路径总和(C++)
112. 路径总和给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。解题思路:看到这道题,首先觉得与二叉树的所有路径非常像,完全可以用二叉树的所有路径思路来解题。需要做修改的地方就是在获取路径的时候进行求和,最后所有路径和与目标和做比较。代码:进阶方法:当我看了代码随想录的解题方法,发现了我之前写的方法的问题。其实当遍历时,原创 2022-06-09 20:01:09 · 502 阅读 · 0 评论