LeetCode
文章平均质量分 68
记录LeetCode刷题的一些思路,以及题解
~海棠树下~
相信一切都是最好的安排
展开
-
LeetCode | C++ 单调栈——503.下一个更大元素II、42. 接雨水
这样就找到了一个凹槽,找到左右两边更大元素 的 最小值,减去 height[i],即为 h, 左右两边更大元素 下标 相减 再 减 1, 即为 宽, 长 × 宽 即为体积。顺序,当遇到 遍历元素 大于 栈顶元素时,即找到了 栈顶元素 的右边更大的元素,而对于栈顶元素 栈里面的下一个元素(即第二个元素),即为栈顶元素的 左边更大的元素。把每一个位置的左边最高高度和右边最高高度记录在一个数组上, 对于当前位置来说,左边最高 高度 是前一个的左边最高高度和本高度的最大值.属于横向求解,按照行方向。原创 2023-07-21 19:16:56 · 62 阅读 · 0 评论 -
LeetCode | C++ 491.递增子序列、46.全排列、47.全排列 II
因为本题说 数值范围在[-100, 100]之间,所以可以用数组来做哈希,更省时,定义[201]的数组,对每个值 都 + 100, 将范围变到 [0, 201]原创 2023-06-21 13:48:50 · 19 阅读 · 0 评论 -
LeetCode | C++ 贪心算法——1005.K次取反后最大化的数组和 、134. 加油站、135. 分发糖果
然后再从右向左遍历,确定左边比右边大的情况,只要左边比右边的大,左边就比右边多一个糖果,此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。首先从左向右遍历,先确定右边评分大于左边的情况,只要右边比左边的大,右边就比左边多一个糖果,全局最优:相邻的孩子中,评分高的右孩子获得比左边孩子更多的糖果。:主要是模拟跑一圈的过程,可以使用。原创 2023-06-26 15:34:06 · 59 阅读 · 0 评论 -
LeetCode | C++ 贪心算法——860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球
情况一:账单是5,直接收下。情况二:账单是10,消耗一个5,增加一个10情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5。原创 2023-06-27 18:56:43 · 65 阅读 · 0 评论 -
LeetCode | C++ 203.移除链表元素 206.反转链表 707.设计链表
【代码】C++ | LeetCode 203.移除链表元素 206.反转链表 707.设计链表。原创 2023-05-26 16:59:34 · 291 阅读 · 1 评论 -
LeetCode | C++ 344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
【代码】C++ | LeetCode 344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串。原创 2023-05-31 20:24:36 · 32 阅读 · 0 评论 -
LeetCode | C++ 动态规划——309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
状态2:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期,或是前一天就卖出股票状态,一直没操作) 也就是冷冻期之后,这些都是保持卖出股票的状态。 前一天是保持卖出股票的状态(状态2),dp[i - 1] [1] - prices[i](1) 前一天就是持有股票状态,dp[i] [0] = dp[i - 1] [0] 前一天是冷冻期(状态4),即dp[i - 1] [3] - prices[i]dp[i] [j],第i天状态为j,所剩的最多现金为dp[i] [j]。昨天卖出了股票(状态3)原创 2023-07-15 17:29:39 · 162 阅读 · 0 评论 -
LeetCode | C++ 动态规划——343. 整数拆分、96.不同的二叉搜索树
1到i为节点组成的二叉搜索树的个数为dp[i]。j相当于是头结点的元素,从1遍历到i为止。所以。原创 2023-07-04 07:49:08 · 44 阅读 · 0 评论 -
LeetCode | C++ 144.二叉树的前序遍历、145.二叉树的后序遍历、94.二叉树的中序遍历
该知识点参考卡哥。原创 2023-06-06 23:02:26 · 43 阅读 · 0 评论 -
LeetCode | C++ 贪心算法——122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II
局部最优:收集每天的正利润,全局最优:求得最大利润55. 跳跃游戏贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。45.跳跃游戏II在每一步可以达到的范围内寻找下一步可达到的最大覆盖范围,以此求得最小步数,一旦覆盖范围覆盖到终点,即输出步数原创 2023-06-24 10:54:02 · 84 阅读 · 0 评论 -
LeetCode | C++ 动态规划——01 背包理论代码,应用:416.分割等和子集
dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。原创 2023-07-07 19:31:03 · 261 阅读 · 0 评论 -
LeetCode | C++ 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
判断左子树有没有 出现p , 出现就往上返回, 右子树有没有出现q, 出现就往上返回, 最后判断中,若左右都不为空,即为 最近公共祖先。当p q 其中一个 本身就为 最近公共祖先时,这种情况以及被包含着 上面了, 当遇到 最近公共祖先时,就返回了,就不忘下遍历了。第一,如果不是搜索树,只是普通的二叉树, 就直接进行遍历,用map对频率进行统计,并进行排序。所以该题 只能用 后序遍历 左 右 中, 回溯的 过程 就是中, 中 才是我们的处理逻辑。第二步: 找到与最大次数相同的次数的值。原创 2023-06-14 20:34:30 · 62 阅读 · 0 评论 -
LeetCode | C++ 回溯算法总结(参考代码随想录)77. 组合
回溯搜索法是递归的副产品,只要有递归就会有回溯,通常递归函数的下面就是回溯的逻辑。本质是穷举,并不高效。那为啥还要使用这种方法呢,因为针对一些问题能够通过暴力搜索出来,撑死优化就是再剪枝下,就已经很好了,找不到更优的解决办法。原创 2023-06-16 22:11:39 · 64 阅读 · 0 评论 -
LeetCode | C++ 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II
【代码】C++ | LeetCode 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II。原创 2023-05-27 17:10:27 · 161 阅读 · 1 评论 -
LeetCode | C++ 贪心算法——738.单调递增的数字、968.监控二叉树
但是会有1000 这种情况,按照上面方法会变成900,显然不是最大的,所以调整上述方法,记录变为9的最大i 位置,然后将其后面的值全部变成9.在回溯遍历到空节点的时候,空节点的状态只能赋值为 有覆盖,其他两种状态 均无法使得 叶子节点的父节点放摄像头。1、当左右孩子都为 有覆盖2 时,父节点为无覆盖0,等着父节点的父节点安装摄影头将其覆盖。叶子节点的父节点优先放摄像头,然后向上遍历的过程中,然后每隔两个节点放一个摄像头,无摄像头的状态其实就分为 0、2,要么有覆盖,要么无覆盖。原创 2023-07-01 19:13:31 · 51 阅读 · 0 评论 -
LeetCode | C++ 动态规划——121. 买卖股票的最佳时机、122.买卖股票的最佳时机II
dp[i] [0] 表示第i天持有股票所得最多现金dp[i] [1] 表示第i天不持有股票所得最多现金。原创 2023-07-11 19:30:32 · 371 阅读 · 0 评论 -
LeetCode | C++ 232.用栈实现队列、225. 用队列实现栈
【代码】C++ | LeetCode 232.用栈实现队列、225. 用队列实现栈。原创 2023-06-02 21:59:10 · 50 阅读 · 1 评论 -
LeetCode | C++ 动态规划——1143.最长公共子序列、1035.不相交的线、53. 最大子序和
长度为[0, i - 1]的字符串 text1 与长度为[0, j - 1]的字符串 text2 的最长公共子序列为 dp[i] [j]原创 2023-07-16 18:12:45 · 357 阅读 · 0 评论 -
LeetCode | C++ 单调栈——84.柱状图中最大的矩形
以每一个柱子为基准,都去找左边比它矮的 右边比它矮的,这样就确定了它的宽,再用这个柱子的高去 乘以 它的 宽,就能算出来 在这个柱状图中,它所能形成的 矩形面积,最后选一个最大的。首 加上 0:以 柱形元素为[8, 6, 4, 2]为例,6 比 8 小,需要弹栈,此时只有 mid 和 right,缺少 left。尾 加上 0:以 柱形元素为[2, 4, 6, 8]为例,将会把所有元素全部入栈,没有计算过程,因此 尾巴加上 0, 进行计算。定义两个数组 存储每个柱子的 左右比它矮的下标,在遍历的时候,原创 2023-07-22 11:13:30 · 230 阅读 · 0 评论 -
LeetCode | C++ 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
对于本题而言,选取中间结点的时候一定要选取中间位置的结点,只有这样,才能保证它的左区间的结点数量和右区间的结点数量是相同的,这样构造出来的二叉树才能保证它是平衡的。对于该题,对结点中的判断逻辑,如果为NULL,就返回NULL, 如果 < low, 则再次去遍历 该节点的右子树,因为右子树中可能会有符合条件的值, 对处理过的右子树进行返回, 同样的,如果 > high, 则再次去遍历 该结点的左子树,因为左子树可能会有符合条件的值, 对处理 过的左子树进行返回。其他语言就没有这个问题,自带内存回收机制。原创 2023-06-16 17:19:37 · 46 阅读 · 0 评论 -
LeetCode | C++ 93.复原IP地址、78.子集、90.子集II
本题也是切割问题,只不过终止条件不能像131 分割回文串一样用切割线,因为题目明确 只能切成4段, 所以将分割的段数作为终止条件,在这里引入一个 pointNum 来记录 分割符 . 的数量, 当数量为 3 且 最后一段也合理时,即跳出循环。单层搜索逻辑,假如分割的字段合理,就在其后面 加上 . 分割符,注意回溯的时候也需要将其删掉。该题目唯一需要注意的就是:收集子集 要写在终止条件的上面,否则就把子集给漏掉了。本题是 40.组合总和II 和 78.子集这两道题目的结合。原创 2023-06-20 11:16:17 · 34 阅读 · 0 评论 -
LeetCode | C++ 贪心算法——理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和
默认第一个值前面有一个相同的值,产生平坡, prediff = 0, 将数组首考虑进来,result 默认为1, 将 数组尾考虑进来。局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。遍历的时候,一定是先遍历孩子,再遍历饼干,因为如果饼干不能满足条件的话,是不能一直 减减的。思路:用小饼干尽量先去满足胃口小的孩子,或者用大饼干尽量先去满足胃口大的孩子。对孩子的胃口,和饼干进行排序。全局最优:选取最大“连续和”原创 2023-06-23 11:31:57 · 49 阅读 · 0 评论 -
LeetCode | C++ 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
【代码】C++ | LeetCode 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和。原创 2023-05-30 21:30:42 · 63 阅读 · 1 评论 -
LeetCode | C++ 动态规划——392.判断子序列、115.不同的子序列
表示以下标 i - 1为结尾的字符串s,和以下标j - 1为结尾的字符串 t,相同子序列的长度为dp[i] [j]。(i - 1, j -1 为结尾,方便初始化)原创 2023-07-17 09:45:16 · 208 阅读 · 0 评论 -
LeetCode | C++ 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
对于该题而言,结点的值中会出现int 类型的最小值,所以在比较时,我们只能比int 最小值还要小,所以定义的为 long long max val = long_min。对于判断一个数组是否有序,可以不需要额外去定义一个变量来比较,可以通过前后两者进行比较,对于二叉树而言,即为前一个结点和后一个结点进行比较。按照 二叉搜索树的特性去遍历,看其是否是一个 有序数组。即:对于二叉搜索树来说,使用 中序遍历得到 的数组为一个递增 的数组。前序遍历是 中左右, 因为只有构造了中结点, 才能去构造它的左右孩子结点。原创 2023-06-13 17:44:21 · 55 阅读 · 0 评论 -
LeetCode | C++ 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值
栈由于先进后出的数据结构特征,用途广泛:括号匹配、后缀表达式、类似于递归。原创 2023-06-03 21:08:02 · 55 阅读 · 0 评论 -
LeetCode | C++ 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
最后一种情况是最复杂的,可以采取以下两种方式进行求解:将左子树接到右子树最左边的结点的左边;或者 将右子树街道左子树最右边的结点的右边,这样就转化为 3、4 两种情况。如果找到对应的叶子结点,插入时 是需要父节点的。对于二叉搜索树来说,要插入一个与树中结点都不相同的结点,在叶子结点都可以找到它的位置。(2)要删除的结点位叶子结点,左右孩子均为空。(3)要删除的结点左孩子为空,右孩子不为空。(4)要删除的结点右孩子为空,左孩子不为空。(1)二叉搜索树中没有要删除的结点。(5)要删除的结点左右孩子均不为空。原创 2023-06-15 15:22:29 · 43 阅读 · 0 评论 -
LeetCode | C++ 动态规划——62.不同路径、63. 不同路径 II
到达第 i 行 第 j 列的路径数。原创 2023-07-03 17:32:29 · 72 阅读 · 0 评论 -
LeetCode | C++ 动态规划——70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数
凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。dp[j] 可以由dp[j - i * i]推出, dp[j - i * i] + 1 便可以凑成dp[j]。和为 j 的完全平方数的最少数量为dp[j]原创 2023-07-10 12:50:04 · 183 阅读 · 0 评论 -
LeetCode | C++ 110.平衡二叉树、257. 二叉树的所有路径、 404.左叶子之和
二叉树的所有路径这道题目还是有点小懵。原创 2023-06-10 15:16:36 · 29 阅读 · 0 评论 -
LeetCode | C++ 动态规划——647. 回文子串、516.最长回文子序列
表示区间范围[i, j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i] [j]为true,否则为false。原创 2023-07-20 19:19:53 · 90 阅读 · 0 评论 -
LeetCode | C++ 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、 1. 两数之和
【代码】C++ | LeetCode 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、 1. 两数之和。本节介绍哈希表,主要应用于:需要在一个集合中快速查找一个元素是否存在。一般使用的数据结构为:数组、set、map;数组即为利用下标快速访问元素的天然哈希表;set 与 map 两个容器类型比较相似,set 是只存储关键字作为元素,map 是将关键字作为 key, 关键字的值 作为 value, 将这一对作为一个元素进行存储。原创 2023-05-29 18:27:34 · 74 阅读 · 0 评论 -
LeetCode | C++ 单调栈——单调栈理论、739. 每日温度、496.下一个更大元素 I
单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素(不然就不知道之前都遍历过哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的),优点是整个数组只需要遍历一次。为什么栈里面的元素是保证单调递增的,因为只有这样,当遍历元素大于栈顶元素时,才能计算栈顶元素在数组里它右面第一个比栈顶元素大的,其实就是我们正在遍历的这个元素。当遍历元素 大于 栈顶元素时: 需要对栈顶元素( 下标 )的 result 结果进行赋值,然后将栈顶元素弹栈,继续比较,直到不大于为止。原创 2023-07-21 15:13:01 · 52 阅读 · 0 评论 -
LeetCode | C++ 动态规划——300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
dp[i] 表示 i 之前包括 i 的以 nums[i]结尾 的最长递增子序列的长度需要包含nums[i]结尾,不然在做递增比较的时候,就没有意义了。原创 2023-07-16 12:35:55 · 265 阅读 · 0 评论 -
LeetCode | C++ 贪心算法——435. 无重叠区间、763.划分字母区间、56. 合并区间
本题与452用最少数量的箭引爆气球非常相似,按照左边界进行排序,计算非重叠区间的个数,对于重叠区间来说,需要计算重叠边界的最小右边界;如果两者重叠,也就是把第i个重叠区间的右边界转化为两者的最小右边界即可。题意:同一个字母最多出现在一个片段中,为了把同一个字母放到一个片段,在其中涉及的其他字母也要放到该片段,即找到所涉及字母的最远边界。首先按照左边界从大到小进行排序,如果相邻两个区间有重叠,则更新右边界为两者之中最大的,如果没有重叠,则直接放入结果中。首先利用数组哈希表对字母出现的最远下标进行存储。原创 2023-07-01 11:40:03 · 30 阅读 · 0 评论 -
LeetCode | C++ 28. 实现 strStr()、459.重复的子字符串
初次接触kmp算法,确实不太好理解,后面还需要多看几次。原创 2023-06-01 16:40:06 · 56 阅读 · 0 评论 -
LeetCode | C++ 704. 二分查找 35. 搜索插入位置 27. 移除元素
相较于使用暴力解法O(n), 二分法的时间复杂度更低为O(log(n)),二分法本身的思路并不复制,问题在于区间边界,可以通过在纸上简单演示下,即可明确。原创 2023-05-24 18:24:53 · 485 阅读 · 2 评论 -
LeetCode | C++ 239. 滑动窗口最大值、 347.前 K 个高频元素
没有将滑动窗口中所有的元素都加进来,而是只维护当前窗口中有可能成为最大的元素。因为需要对 队列首尾都要进行处理,所以使用。数据结构记录每个元素值 以及 出现次数,然后利用具有。,取出前K个高频元素。原创 2023-06-05 14:32:40 · 40 阅读 · 0 评论 -
LeetCode | C++ 513.找树左下角的值、112. 路径总和 113.路径总和ii 、 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
本题给出了 便于理解的题解,但是每次递归时定义了新的vector,对空间和时间有很大的消耗,下面给出了,对于数组分割的优化解法:利用vector 下标索引进行处理。对于本方法需要注意的是:需要把之间对vector的操作,全部变成索引之间的关系来表示。因为优先遍历的是左节点,所以只要我们一旦得到深度最大的节点,我们得到的就是最后一行最靠左侧的结点。在遍历的时候每当遇到深度 比之前 深度大的结点,就更新最左侧的值。(5)基于切割后的中序数组,进行后序数组的切割。(2)后序数组中的最后一个元素为结点元素。原创 2023-06-11 19:29:15 · 55 阅读 · 0 评论 -
LeetCode | C++ 动态规划——完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ
即可以先物品再背包,或者先背包再物品,因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的。即无论 按 行,或者按列,填充 dp[j], 都是从 小 到大, 而 dp[j] 是根据先前的dp[j]计算出来的,所以没影响。每一个背包容量都是 1,2 的情况下进行遍历,每一个容量下都 放了 1 2,所以说,这里面 既有 {1, 2} 也有 {2, 1}下标非0的dp[j]初始化为0,这样累计加dp[j - coins[i]]的时候才不会影响真正的dp[j]凑成目标正整数为j的排列个数为dp[j]原创 2023-07-09 19:08:13 · 106 阅读 · 0 评论