自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 Day59| Leetcode 503. 下一个更大元素 II Leetcode 42. 接雨水

此时的栈顶元素st.top(),就是凹槽的左边位置,下标为st.top(),对应的高度为height[st.top()](就是图中的高度2)。取栈顶元素,将栈顶元素弹出,这个就是凹槽的底部,也就是中间位置,下标记为mid,对应的高度为height[mid](就是图中的高度1)。本题目运用常规思路就是记录左边柱子的最高高度 和 右边柱子的最高高度,就可以计算当前位置的雨水面积,这就是通过列来计算。当前遍历的元素i,就是凹槽右边的位置,下标为i,对应的高度为height[i](就是图中的高度3)。

2023-12-22 15:12:26 164

原创 Day58|Leetcode 739. 每日温度 Leetcode 496. 下一个更大元素 I

本题目和上面的题目差不多,这里只不过是拆成了两个数组,所以我们这里需要一个哈希映射,来找存在于num1中的和nums2中遍历元素相等的下标,我们这里用unordered_map,还需要注意一个点就是unordered_map的性质:unordered_map::count()是C++中的内置方法,如果Map中存在具有给定键的值,则此函数返回1,否则返回0。而针对于本题来说,单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。学习单调栈,首先要明白什么时候用到单调栈,

2023-12-21 16:01:45 256

原创 Day57| Leetcode 647. 回文子串 Leetcode 516. 最长回文子序列

本题目主要是注意遍历顺序,因为dp[i][j]是dp[i+1][j-1]推导出来的,所以,i要倒序遍历,j要正序遍历,下面就是三种情况。

2023-12-21 13:15:39 131

原创 Day56| Leetcode 583. 两个字符串的删除操作 Leetcode72. 编辑距离

当word1[i - 1] 与 word2[j - 1]相同的时候,dp[i][j] = dp[i - 1][j - 1];情况三:同时删word1[i - 1]和word2[j - 1],操作的最少次数为dp[i - 1][j - 1] + 2。情况一:删word1[i - 1],最少操作次数为dp[i - 1][j] + 1。情况二:删word2[j - 1],最少操作次数为dp[i][j - 1] + 1。

2023-12-21 10:15:40 121

原创 Day55| Leetcode 392. 判断子序列 Leetcode 115.不同的子序列

所以当s[i - 1] 与 t[j - 1]相等时,dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];= t[j - 1])这种情况,此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];,dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。这一类问题,基本是要分析两种情况。

2023-12-20 15:48:59 60

原创 Day53| Leetcode 1143. 最长公共子序列 Leetcode 1035. 不相交的线 Leetcode 53. 最大子数组和

一定是取最大的,所以dp[i] = max(dp[i - 1] + nums[i], nums[i]);

2023-12-20 13:35:55 115

原创 Day52| Leetcode 300. 最长递增子序列 Leetcode 674. 最长连续递增序列 Leetcode 718. 最长重复子数组

贪心和dp都可以,题目比较简单,只需查找nums[i]>nums[i-1]的情况即可,取最大的情况。常规思路吧,注意一下dp数组的含义。

2023-12-20 09:36:28 93

原创 Day51| Leetcode 309. 买卖股票的最佳时机含冷冻期 Leetcode 714. 买卖股票的最佳时机含手续费

那么dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);本题目需要考虑的状态挺多的,所以整体显得比较麻烦,搞清楚状态,剩下的内容和前面的普通版买股票差不多。即:dp[i][2] = dp[i - 1][0] + prices[i];昨天一定是持有股票状态(状态一),今天卖出。昨天卖出了股票(状态三)

2023-12-19 15:45:41 76

原创 Day50| Leetcode 123. 买卖股票的最佳时机 III Leetcode 188. 买卖股票的最佳时机 IV

dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。只要理解几个状态就可以了,因为剩下的内容和前面一样的。确定dp数组以及下标的含义。Leetcode 123. 买卖股票的最佳时机 III。一天一共就有五个状态,

2023-12-19 10:39:42 96

原创 Day49| Leetcode 121. 买卖股票的最佳时机 Leetcode 122. 买卖股票的最佳时机 II

那么第i天持有股票即dp[i][0],如果是第i天买入股票,所得现金就是昨天不持有股票的所得现金 减去 今天的股票价格 即:dp[i - 1][1] - prices[i]。同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);那么dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);dp[i][0] 表示第i天持有股票所得最多现金 ,

2023-12-12 11:55:50 110

原创 Day48| Leetcode 198. 打家劫舍 Leetcode 213. 打家劫舍 II Leetcode 337. 打家劫舍 III

仔细发现情况23包括情况1,所以只考虑情况23就可以了。打家劫舍系列,比较好理解。end,陆续考试挺多的。

2023-12-11 21:34:40 124

原创 Day45| 爬楼梯 (进阶)Leetcode 322. 零钱兑换 Leetcode 279. 完全平方数

只不过是把顺序数改成了平方数,思路一样的,

2023-12-08 12:45:53 380

原创 Day44| Leetcode 518. 零钱兑换 II Leetcode 377. 组合总和 Ⅳ

本题目就是上个题目的改版,这个要求的是排列数,所以我们只需先便利背包,在遍历物品即可(原因卡哥讲过),还要注意C++测试用例有两个数相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。由于是可以选取多个元素,所以是完全背包,要注意在遍历顺序中前序遍历,其他的和前面的目标数这个题目类似,要理解dp[j]+=dp[j-nums[i]]的来源。(总体来是还是比较难想的)

2023-12-07 19:51:58 154

原创 Day43| Leetcode 1049. 最后一块石头的重量 II Leetcode 494. 目标和 Leetcode 474. 一和零

这个方程的意思是,如果我们要用若干个元素组成和为j的方案数,那么有两种选择:不选第i个元素或者选第i个元素。如果不选第i个元素,那么原来已经有多少种方案数就不变;如果选第i个元素,那么剩下要组成和为j - nums【i】 的方案数就等于dp[j - nums【i】]。本题思路用一句话概括本题:其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小。要注意dp的含义:dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法。假设加法的总和为x,那么减法对应的总和就是sum - x。

2023-12-06 14:30:51 354

原创 Day42| Leetcode 416. 分割等和子集

本题目第一个反应是用回溯法,但是会超时,用dp滚动数组是最优的,但是这里要注意,容量和价值是相同的,也就是说只要让target == dp[target]即可,如果target为奇数,也没法满足要求。

2023-12-05 13:19:35 227

原创 Day41| Leetcode 343. 整数拆分 Leetcode 96. 不同的二叉搜索树

所以递推公式:dp[i] += dp[j - 1] * dp[i - j](dp[1],dp[2]在递推公式中可以推断出,所以不用初始化);在上面的分析中,其实已经看出其递推关系, dp[i] += dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量]所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量。

2023-12-04 20:17:53 190

原创 Day39| Leetcode 62. 不同路径 Leetcode 63. 不同路径 II

dfs题不多说了,dp也可以做。

2023-12-04 19:22:33 363

原创 Day38| Leetcode 509. 斐波那契数 Leetcode 70. 爬楼梯 Leetcode 746. 使用最小花费爬楼梯

【代码】Day38| Leetcode 509. 斐波那契数 Leetcode 70. 爬楼梯 Leetcode 746. 使用最小花费爬楼梯。

2023-12-04 18:12:29 315

原创 Day37| Leetcode 738. 单调递增的数字

本题目思路还是比较巧妙的,对于98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。遇到贪心的题目做法就是怎么将利益做到最大化,从局部到整体利益最大化的一个过程。今天就一个题目,做完吃完饭抓紧做六级试题。

2023-11-30 11:47:35 148

原创 Day36| Leetcode 435. 无重叠区间 Leetcode 763. 划分字母区间 Leetcode 56. 合并区间

本题目审好题目就解决了,贪心思路:删除最最少的区间使其没有存在重叠区间 ,我们就让其最大化重叠区间,删除全部的重叠区间即可。此时前面出现过所有字母,最远也就到这个边界了。在遍历的过程中相当于是要找每一个字母的边界,如果找到字符最远出现位置下标和当前下标相等。本题目还是比较难想的,说一下思路吧。

2023-11-29 13:13:59 108

原创 Day35| Leetcode 860. 柠檬水找零 Leetcode 406. 根据身高重建队列 Leetcode 452. 用最少数量的箭引爆气球

局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。

2023-11-28 14:30:18 736

原创 Day34| Leetcode 1005. K 次取反后最大化的数组和 Leetcode 134. 加油站 Leetcode 135. 分发糖果

成立,才能兼顾题目中所说的相邻两个孩子评分更高的孩子会获得更多的糖果,并且需要最少的糖果,如果反过来,取两边高的话,就会不满足最少的糖果的要求,这里也说明了,在判断左孩子比右孩子大的时候,为什么需要后序遍历的原因,如果前序遍历就没法满足。本题一共用到了两个贪心,第一个是我们的数组中有负数时每次就让绝对值最大的负数转变,直到用到k为零,第二个贪心的地方,如果都为正数,就取最小的一个正数来让其不停的取反,如果k为奇数,反转一次就行,如果k为偶数,即不需要反转。其次,需要满足一个点:我们要让这个等式。

2023-11-27 15:54:02 265

原创 Day32| Leetcode 122. 买卖股票的最佳时机 II Leetcode 55. 跳跃游戏 Leetcode 45. 跳跃游戏 II

本题目设计的还是比较巧妙的,把最终的利润分为每天的利润就解决了(贪心),每天的利润就是前一天买进,后一天卖出,转化到代码上就是:p[i]-p[i-1],我们要取得最大利润,就需要最起码让每天的利润不为负数,所以我们只需要取每天大于0的利润加起来就能得到最终的最大利润了。本题目还是比较有按难度的,首先说一下贪心思路:我们用每步最大的覆盖范围来取得最少的步数。本题目之前在dp专题做过两个差不多的,本题目比较简单,直接说贪心思路了,取最大范围,在i点时,最大范围能否到达最后一个点就可以判断了。

2023-11-25 15:27:33 537

原创 Day31| Leetcode 455. 分发饼干 Leetcode 376. 摆动序列 Leetcode 53. 最大子数组和

这时我们就不能实时更新preDiff了,我们只需在遇到(preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)即摆动时我们preDiff。(preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0),我们有波动就需要统计。(preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0),我们有波动就需要统计。

2023-11-24 16:28:55 292

原创 Day29| Leetcode 491. 递增子序列 Leetcode 46. 全排列 Leetcode 47. 全排列 II

【代码】Day29| Leetcode 491. 递增子序列 Leetcode 46. 全排列 Leetcode 47. 全排列 II。

2023-11-22 13:21:52 146

原创 Day28|Leetcode 93. 复原 IP 地址 Leetcode 78. 子集 Leetcode 90. 子集 II

要学习六级了,好痛苦 end。

2023-11-21 16:56:04 609

原创 Day27|Leetcode 39. 组合总和 Leetcode 40. 组合总和 II Leetcode131. 分割回文串

(默认sort排序)在树枝上的去重我们已经完成,我们再看在树层上,取第二个1的时候下面的情况1,2,已经在取第一个1时下面的情况中涉及到了,因为,第一个1后面既有重复的第二个1,也有第二个1后面的元素,所以第一种1一定会包含第二种1的情况。上面的题目都是组合类的,从这个题目开始就进入分割类题目了,其实组合和分割是一个意思,同样能用树状结构来解决。

2023-11-20 19:31:35 471

原创 Day25| Leetcode 216. 组合总和 III Leetcode 17. 电话号码的字母组合

本题目之前做过一道类似的,也忘得差不多了。二叉树就差一点了,end。

2023-11-18 14:29:11 240

原创 Day24|Leetcode 77. 组合

今天进入的是回溯法,这部分在acm已经学过了,其实就是dfs深搜,本质上是一样的,其次和递归函数也是一样的,递归中反映着回溯过程(二叉树部分已经很熟悉了),在dfs中,遇到最多的就是需要剪枝,这很重要,能省下很多运行时间。还要继续复习二叉树!

2023-11-17 17:33:46 127

原创 Day23| Leetcode 669. 修剪二叉搜索树 Leetcode 108. 将有序数组转换为二叉搜索树 Leetcode 538. 把二叉搜索树转换为累加树

本题目和前面的中序后序数组构造二叉树的基本思路是一样的,确定中间节点之后,再去构造左右子树,在通过递归来构造左右子树的左右子树。本题上来看还是有难度的,也算是对删除二叉树节点的升级版,但是想清楚还是比较简单的。本题目是有序数组,简单一些,找到中间值,确定好区间闭开情况(变量唯一性)

2023-11-16 13:45:56 142 1

原创 Day22| Leetcode 235. 二叉搜索树的最近公共祖先 Leetcode 701. 二叉搜索树中的插入操作 Leetcode 450. 删除二叉搜索树中的节点

一刷还是以递归法为主,前面做过二叉树的最近公共祖先,那个题目比较麻烦因为需要精准找到每个q,p才能做出判断,本题目需要利用二叉搜索树的特征点,本题目的解题点:如果遍历的节点的值在q,p之间,那么该节点就是两个节点的最近公共祖先,原因是什么呢,在该节点的基础上继续向左遍历就会将p节点丢失,在该节点的基础上向右遍历也会将q节点丢失,所以说,该节点就是两个节点的最近公共祖先。第五种情况需要画图了解以下,剩余的部分和前面的插入节点差不多,

2023-11-15 21:16:40 220

原创 Day21| Leetcode 530. 二叉搜索树的最小绝对差 Leetcode 501. 二叉搜索树中的众数 Leetcode 236. 二叉树的最近公共祖先

情况一:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。本题目我觉得需要的技巧还是很多的,不只是从单单的双指针法来入手的,后面的对maxCount的确定至关重要,除此之外,还要注意中序遍历,中序遍历!但是很多人容易忽略一个情况,就是节点本身p(q),它拥有一个子孙节点q(p)。情况二:二叉树节点数值是不重复的,而且一定存在 q 和 p。

2023-11-14 14:50:34 263

原创 Day20| Leetcode 654. 最大二叉树 Leetcode 617. 合并二叉树 Leetcode 700. 二叉搜索树中的搜索 Leetcode 98. 验证二叉搜索树

本题目和前面的构造二叉树差不多,但是比之前的简单点,要注意一个点就是在构造二叉树时需要用前序遍历,因为没有根节点,就没法构造左右子树,其次还要注意变量不变性,即区间控制要满足左闭右开。首先要审准题目(怎么合并的),主要是对于两个二叉树的遍历没有做过,首先递归法,两个二叉树同时遍历,将root2的节点值赋给root1,不停递归即可。一个一个比较(遍历后的节点)是不是单调递增的即可。

2023-11-13 22:47:22 403

原创 Day18| Leetcode 513. 找树左下角的值 Leetcode 112. 路径总和 Leetcode 106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树

首先回忆一下如何根据两个顺序构造一个唯一的二叉树,相信理论知识大家应该都清楚,就是以 后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。本题目和上面的题目差不多,只是输出不同,这里返回的值是全部符合条件的路径,对于我们所写的递归函数的参数与返回值都需要做出一定的改变。我们这里在遍历二叉树时,我们做减法操作,对目标值不停的,当在叶子节点时,若计数器为零,那说明找到了符合要求的路径,反之,找不到。递归函数是有返回值的,如果递归函数返回true,说明找到了合适的路径,应该立刻返回。

2023-11-12 17:50:47 265

原创 Day17|Leetcode 110. 平衡二叉树 Leetcode 257. 二叉树的所有路径 Leetcode 404. 左叶子之和

本题目需要将二叉树的全部节点输出出来,我们肯定要遍历一遍才能将全部的节点都记录一遍,所以,此时我们就要考虑遍历方式,我们会发现输出结果是从根节点往左往右来输出的,所以我们需要前序遍历,在这里,我们去观察输出结果,会发现左右子树需要前后输出,递归完成左子树时,我们就要回溯根节点重新往右子树,所以我们需要用到回溯,递归中已经用到了,但是没有体现出来,但是今天我们要将递归中的回溯写出来。审清题目,什么是左叶子之和,首先要明白什么是叶子节点,叶子节点的左右子节点都为空,然后什么是左叶子节点,就是。

2023-11-10 20:36:08 184 1

原创 Day16|Leetcode 104. 二叉树的最大深度 111.二叉树的最小深度 Leetcode 222.完全二叉树的节点个数

情况二:分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。怎么判断是否为满二叉树呢?左叶子节点的深度等于右叶子节点的深度,(用指针寻找)。思路:先求它的左子树的节点数量,再求右子树的节点数量,最后取总和再加一。本题昨天也写过了,今天用递归法写一下,这里有一个陷阱,就是题目定义了。情况一:就是满二叉树,情况二:最后一层叶子节点没有满。

2023-11-09 16:09:01 214 1

原创 Day15|Leetcode 102.二叉树的层序遍历 Leetcode 226. 翻转二叉树 Leetcode 101. 对称二叉树

本题目如果仔细思考的话,是只能用后序遍历,因为我们要返回的值是root,前序和中序都是左右两边的树节点都没有对比完成就返回是没有可能做对的。这个题目难点在对题目的理解上,如果理解正确,那这道题目就很简单了,也可以跟着代码,把遍历顺序画一遍就明白了。如果这个题目懂了,那么下面这九道题目也就可以做了。换汤不换药,一样的,只是二叉树种类不同,同样适用。就是遍历的最大层数,想想什么时候最大就解决了。和上一道类似,想想什么时候取最小。今天好累,好迷 end。

2023-11-09 00:38:34 208 1

原创 Day14|Leetcode 144. 二叉树的前序遍历 145. 二叉树的后序遍历 94. 二叉树的中序遍历

而到了中序遍历,就有所不同了,(前后序遍历)由于我们要访问的元素顺序和我们要处理元素的顺序是一样的(从根节点层层递进),但这里就不同了,我们需要先处理最左边的然后才是中间根节点,所以说我们需要指针来访问我们需要处理的节点。前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子(因为栈的特点是先进后出,所以我们先记录的就是左孩子,再是右孩子)。今天开始进入下一个环节,二叉树,首先要理解二叉树,需要从二叉树的种类,存储方式,遍历方式,定义方式来讨论,这里不在赘述,

2023-11-08 15:49:07 159 1

原创 Day13|Leetcode 239. 滑动窗口最大值 Leetcode 347. 前 K 个高频元素

本题目可以用的方法有很多,其实最简单的就是sort排序,可是时间复杂度不合适,我们学习一种新的方法,优先级队列,首先优先级队列对外接口只是从队头取元素,从队尾添加元素,再无其他取元素的方式,看起来就是一个队列。在缺省状态下(即系统默认状态)priority_queue利用max-heap(大顶堆)完成对元素的排序,这个大顶堆是以vector为表现形式的complete binary tree(完全二叉树)。在这之前,我们需要统计元素出现的频率,这一类的问题可以使用map来进行统计。

2023-11-07 22:47:37 324 1

原创 Day11|Leetcode 20. 有效的括号 Leetcode 1047. 删除字符串中的所有相邻重复项 Leetcode 150. 逆波兰表达式求值

本题目也是运用栈的原理,将字符串中的字符传入栈中,如果和栈顶字符相同就弹出,如果不相同就传入,但是要注意栈的特征,最后得到的字符顺序是相反的,如果要反过来就需要转成字符串在reverse一下,也可以用字符串模拟栈,两种方法。第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false。第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false。本题目是栈的一个简单应用。今天轻松一些 end。

2023-11-04 17:12:10 295 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除