自定义博客皮肤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)
  • 收藏
  • 关注

原创 [ 一刷完结撒花!! ] Day50 力扣单调栈 : 503.下一个更大元素II |42. 接雨水 | 84.柱状图中最大的矩形

pop 再 push, 栈顶就是第二个 4 , 下面是 1 . 拿到元素 3 的时候, 计算的宽度也是 3 - 0 - 1 = 2. 算的是到 1 到 3 的宽度. 是大的那个.但是栈顶下面的元素就是第一个 1 , 在计算高度的时候, 取第一个 1 和 3 更小的那个 再减去栈顶的第二个 1 . 高度就是0 , 就白计算了.自己就是栈顶元素, 拿来的元素 i 可能是右边更大的(不更大就push入栈了), 那左边更大的在哪?重要的是, 这道题是横向的求雨水面积, 我一直想的是 纵向的求雨水面积.

2023-11-19 14:43:17 226

原创 Day49 力扣单调栈 : 739. 每日温度 |496.下一个更大元素 I

单调栈就是用于找一个元素左 / 右第一个比自己大 / 小的元素的题目。单调栈的本质是空间换时间, 更直白来说,就是用一个栈来记录我们遍历过的元素,因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。在使用单调栈的时候首先要明确如下几点:1.单调栈里存放的元素是什么?单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。2.单调栈里元素是递增呢?

2023-11-17 13:39:33 263

原创 Day48 力扣动态规划 : 647. 回文子串 |516.最长回文子序列 |动态规划总结篇

总结可以直接看代码随想录了,我先做一下简单的总结。动态规划感觉,一开始的一些题比较简单,属于用手就能模拟,比如爬楼梯那种,就给我一种数学归纳法的感觉。后来到了背包问题,我觉得比较难理解,但我理解的还可以,做了不少总结。难在 dp 数组的理解、递推公式的理解、遍历顺序也会变。然后打家劫舍,树形的打家劫舍不好弄,整体不算难。股票问题,感觉很套路。难在 dp 数组的理解、递推公式的理解,遍历顺序就还好。编辑距离,就是字符串上的一些操作,我也不理解为什么叫编辑距离。遍历顺序也是后面发生改变了。最后就是。

2023-11-16 13:18:29 519

原创 Day47 力扣动态规划 :583. 两个字符串的删除操作|72. 编辑距离 | 编辑距离总结篇

做一个总结吧直接看卡哥的总结吧。

2023-11-15 16:32:45 171

原创 Day46 力扣动态规划 : 392.判断子序列 | 115.不同的子序列

如果用它来匹配t[2] 的g,这种情况s包含t的个数就是bag包含ba的个数. dp[i-1][j-1]dp[i-1][j]这么说最长公共子序列那道题,max(dp[i-1][j], dp[i][j-1]) 就是模拟删除 s和删除 t两种?dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。当s[i - 1] 与 t[j - 1]相等时,dp[i][j] 有两部分组成,一个是。dp[0][]0] 代表s和t都是空的,s里面有多少个t,也是有一个。

2023-11-13 13:12:52 86

原创 Day45 力扣动态规划 : 1143.最长公共子序列 |1035.不相交的线 | 53. 最大子序和

其实也就是,dp[i-1] 放的是之前的最大和,如果这个最大和+nums[i] 和nums[i] 相比是debuff(其实也就是 最大和 < 0 就是debuff),那完全可以从nums[i]开始了,没必要要前面的了。所以要对两个元素不相等的情况赋值,这样两个元素相等的时候,也不需要去找最大的那个长度再 +1 了,可以直接dp[i-1][j-1] + 1。感觉不能找之前的最大的那个,比如这个c,在dp[3][3]赋值一次变成3之后,又在dp[5][4] 变成 4了,但其实它只应该操作一次。

2023-11-09 18:50:11 302

原创 Day44 力扣动态规划 : 300.最长递增子序列|674. 最长连续递增序列 | 718. 最长重复子数组

这样就是拿来nums1 里的第一个元素,然后挨个比较nums2里的 j,如果有相同,那么这个位置的最长重复子串就是 1. dp[1][j] = dp[0][j-1] + 1 = 0 + 1 = 1。比如dp[1][1]就遇到重复元素了,dp[1][1] 应该是1。但也不是每次都要更新到dp[i] ,因为求的是最大的子序列,只有当前元素 j 算出的 dp[j] + 1比dp[i] 更大的时候,才会更新。比如上面的例子, j遍历到 1的时候,1 4是递增子序列,算出来的dp[3] + 1 = 2。

2023-11-09 15:54:39 137

原创 Day43 力扣动态规划 :309.最佳买卖股票时机含冷冻期|714.买卖股票的最佳时机含手续费 |股票总结

股票问题做一个总结吧直接看卡哥的总结吧。我觉得股票问题比背包简单,思路很固定。只有一个难点:到底有几个状态,状态之间怎么转移对于遍历顺序和初始化基本没有什么难的。121.买卖股票的最佳时机 (opens new window),股票只能买卖一次,问最大利润。122.买卖股票的最佳时机II (opens new window)可以多次买卖股票,问最大收益。123.买卖股票的最佳时机III (opens new window)最多买卖两次,问最大收益。

2023-11-05 15:54:13 163

原创 Day42 力扣动态规划 :123.买卖股票的最佳时机III |188.买卖股票的最佳时机IV

对于 j = 0 的情况,如果在 i 天,计算第一次拥有的最大钱。比如2-2的位置代表,第一天买第三天卖出有最多收益,2-4的含义也是第一天买第三天卖出有最多的收益。这里画出一个两次买卖的图就更能清晰的对比了,明白第二次买卖是怎么变的和第一次不一样的,但我懒了。分析一下题目里的状态,因为最多买入两次,所以有第一次的持有+不持有、第二次的持有+不持有。我们会发现,每一天第一次卖出的情况是在不断更新的,第二次卖出和第一次卖出的数值也是一样的。它们是重复的,所以可以看作2-4 就是 2-2的当天再次买卖的情况,

2023-11-01 17:01:04 574

原创 Day41 力扣动态规划 :121. 买卖股票的最佳时机|122.买卖股票的最佳时机II

详细布置股票问题是一个动态规划的系列问题,今日安排的题目不多,大家可以慢慢消化。

2023-10-27 16:17:49 115

原创 Day40 力扣动态规划 :198.打家劫舍 |213.打家劫舍II | 337.打家劫舍III

今天就是打家劫舍的一天,这个系列不算难,大家可以一口气拿下。

2023-10-27 15:28:32 87

原创 Day39 力扣动态规划 :139.单词拆分 |关于多重背包,你该了解这些! |背包问题总结篇!

确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组第一个难点在于,透过题目分析出是个背包问题找到背包和物品,背包的大小,物品的重量和价值。dp数组的含义要清晰,一般直接拿问题的含义来定义这个数组。也就是说第一行的dp[3] 是基于自己和 j = 2时,计算更新后的dp[2] 计算出来的。反过来看左边的情况,第一行的dp[3] 是基于自己和 j = 1时算出来的dp[2] 计算出来的。

2023-10-24 18:00:26 107

原创 Day38 力扣动态规划 :70.爬楼梯 |322. 零钱兑换 |279. 完全平方数

按照习惯 还是dp[i] = 0. 但这里不行了,因为每次都取最小是,如果初始化都是 0 的话,每次取dp[j] 和dp[j-coins[i]] + 1 小的那个,那么dp数组永远都是 0 了。所以数组初始化应该是MAX - 1. 这样的话,dp[1] + 1= MAX, dp[3] = MAX - 1. 选择更小的,dp[3] 更新为MAX - 1.既保证了不会溢出整形,也保证了数组最大的是MAX - 1,这样就算遇到下一个dp[3] + 1的时候,也不会溢出。m,也就是有 m 个物品。

2023-10-24 15:37:30 78

原创 Day36 力扣动态规划 :完全背包 |518. 零钱兑换 II |377. 组合总和 Ⅳ

也就是说第一行的dp[3] 是基于自己和 j = 2时,计算更新后的dp[2] 计算出来的。反过来看左边的情况,第一行的dp[3] 是基于自己和 j = 1时算出来的dp[2] 计算出来的。所以对于先物品的情况,这个dp[2] 是没有考虑 钞票2元的。因为遍历顺序上没轮到2元。而对于先背包的情况,这个dp[2] 是考虑了钞票2元的。因为竖着遍历,已经考虑过 如果有2元钞票的话,dp[2] 会是多少了。总之里外里就是差在,21 这样的情况在左面没出现,在右面出现了,所以左面是组合,右面是排列。

2023-10-23 20:44:16 69

原创 Day35 力扣动态规划 : 1049. 最后一块石头的重量 II |494. 目标和 |474.一和零

本题就和 昨天的 416. 分割等和子集 很像了,可以尝试先自己思考做一做。视频讲解:https://www.bilibili.com/video/BV14M411C7oV。

2023-10-21 18:07:49 124

原创 Day34 力扣动态规划 : 01背包问题 二维 |01背包问题 一维 |416. 分割等和子集

正式开始背包问题,背包问题还是挺难的,虽然大家可能看了很多背包问题模板代码,感觉挺简单,但基本理解的都不够深入。如果是直接从来没听过背包问题,可以先看文字讲解慢慢了解 这是干什么的。如果做过背包类问题,可以先看视频,很多内容,是自己平时没有考虑到位的。背包问题,力扣上没有原题,大家先了解理论,今天就安排一道具体题目。

2023-10-21 00:28:14 250

原创 Day33 力扣动态规划 : 343. 整数拆分 |96.不同的二叉搜索树

今天两题都挺有难度,建议大家思考一下没思路,直接看题解,第一次做,硬想很难想出来。

2023-10-19 20:48:47 120

原创 Day32 力扣动态规划 : 62.不同路径 |62.不同路径II

这次感觉要二维数组模拟格子了,数组坐标[x, y],代表现实坐标[x+1, y+1]. dp[x][y] 代表第x+1行 第y+1列的格子的路线数量. 要不我舍弃0行0列,让他们在数值上直接对应呢,还比较方便思考一些哈。所以对于我这个格子来说,走到我这的只有两个可能,我上面走下来的,我左面走过来的。不应该初始化一个机器人的位置,应该要初始化第一行和第一列,这样就不用管有没有左面和上面的格子了,一定会有的。不会,因为障碍是0,比如我的上面是障碍,我就是左面+上面 = 左面。我画了个3x3的例子。

2023-10-18 20:02:24 51

原创 Day31 力扣动态规划 : 理论基础 | 509. 斐波那契数 |70. 爬楼梯|746. 使用最小花费爬楼梯

英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的,

2023-10-18 18:06:11 107

原创 Day30 力扣贪心 : # 738.单调递增的数字| 968.监控二叉树 (可以跳过)| 总结

可以看看贪心算法的总结,贪心本来就没啥规律,能写出个总结篇真的不容易了。直接看代码随想录吧。

2023-10-17 20:44:32 25

原创 Day29 力扣贪心 : 860.柠檬水找零| 406.根据身高重建队列 |452. 用最少数量的箭引爆气球

今天的三道题目,都算是 重叠区间 问题,大家可以好好感受一下。都属于那种看起来好复杂,但一看贪心解法,惊呼:这么巧妙!还是属于那种,做过了也就会了,没做过就很难想出来。不过大家把如下三题做了之后, 重叠区间 基本上差不多了。

2023-10-17 17:02:48 118

原创 Day28 力扣贪心 : 860.柠檬水找零| 406.根据身高重建队列 |452. 用最少数量的箭引爆气球

比如1-4, 2-7, 5-6. 按照我的逻辑1-4 和2-7重叠,箭数量不变,但这个时候4就作为他俩新的右边界限了,和5-6是不重叠的。对于看别人题解的同学,题解用什么语言其实影响不大,只要题解把所使用语言特性优化的点讲出来,大家都可以看懂,并使用自己语言的时候注意一下。对于写题解的同学,刷题用什么语言影响就非常大,如果自己语言没有学好而强调算法和编程语言没关系,其实是会误伤别人的。本题是一道 重叠区间的题目,好好做一做,因为明天三道题目,都是 重叠区间。不能同时考虑两个,要先考虑一个再考虑一个。

2023-10-17 15:10:03 120

原创 Day27 力扣贪心 : 1005.K次取反后最大化的数组和| 134. 加油站 |135. 分发糖果

那么[0, k -1] 这段就一定是 负的,那么按这个逻辑,就已经该从 k 作为起始位置开始了,就没有这个问题了。比如 1 3 -1000 4 5. curGas 到-1000 < 0 了,就从4 开始,接下来的curGas = 4,又遍历到5,cruGas = 9. 那么就返回了从4 这里开始啊?没有审题出,可以反复变动一个元素的下标,比如 -1 0 2 3 ,k=3,应该是最大6,如果排序一次,从index=0的地方开始k个都取反,就是 1 0 -2 3,答案就是2了,就不是最大。然后我就混乱不会了。

2023-10-16 18:03:17 42

原创 Day26 力扣贪心 : 理论基础| 455.分发饼干 |376. 摆动序列 |53. 最大子序和

贪心算法其实就是没有什么规律可言,所以大家了解贪心算法 就了解它没有规律的本质就够了。不用花心思去研究其规律, 没有思路就立刻看题解。基本贪心的题目 有两个极端,要不就是特简单,要不就是死活想不出来。学完贪心之后再去看动态规划,就会了解贪心和动规的区别。我发现很多题都有动态规划的解法啊,二刷再看吧,我还没学。可能就像树那里 递归和迭代吧。

2023-10-14 20:11:53 51

原创 Day25 力扣回溯 : 回溯总结| 332.重新安排行程|51. N皇后|37. 解数独

回溯是暴力的,不是高效算法。回溯和递归一起出现,有递归就有回溯。回溯解决组合、分割、子集、排列和上面三个难题(棋盘问题)的问题。回溯有模板,全局变量(全局变量+参数)参与回溯,像hashset不参与。组合问题有startIndex;排列问题每次都从头来;分割问题难在处理字符串和i + 2这样的细节;子集问题就是每个节点都收集结果的分割问题,子集问题因为遍历整个树,也没有什么终止条件。

2023-10-13 16:07:49 85

原创 Day24 力扣回溯 : 491.递增子序列 |46.全排列 |47.全排列 II

收集的过程我想的出来,比如44325,先拿了4,剩下4325,for循环里就挨个看,>=4的才会add,否则就不要递归。看图里,如果是组合,取2之后,就不要再去看1了,因为取1的地方会有12,如果取了2 再去看1,就会有21。12 ,21 就是重复的。但是难在怎么去重,之前都是排序之后用index来去重,但是这道题不能排序,就会出现 4345 的情况,这两个45 就没法去重。但是排列不同,取了12,也要取21. 所以在排列里,每次for循环都要从数组的头重新来,而不是startIndex来去重了。

2023-10-13 15:45:47 74

原创 Day23 力扣回溯 : 93.复原IP地址 | 78.子集 |90.子集II

题目链接/文章讲解:https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html。大家之前做了 40.组合总和II 和 78.子集 ,本题就是这两道题目的结合,建议自己独立做一做,本题涉及的知识,之前都讲过,没有新内容。但是仔细想确实是,因为每个节点相当于一个for循环,只有合法的才回去递归一个,要是不合法就break,不要这个节点才对。在for循环里,如果合法,才会去递归,不合法就break,这个地方感觉怪怪的。

2023-10-13 13:44:27 71

原创 Day22 力扣回溯 : 39. 组合总和 | 40.组合总和II |131.分割回文串

一些同学可能遇到题目比较难,但是不知道题目难在哪里,反正就是很难。其实这样还是思维不够清晰,这种总结的能力需要多接触多锻炼。

2023-10-11 18:19:20 77

原创 Day21 力扣回溯 : 216.组合总和III | 17.电话号码的字母组合

题目链接/文章讲解:https://programmercarl.com/0017.%E7%94%B5%E8%AF%9D%E5%8F%B7%E7%A0%81%E7%9A%84%E5%AD%97%E6%AF%8D%E7%BB%84%E5%90%88.html。观察例子,比如数字23,那么答案的组合是 一个字母来自2,一个字母来自3,组合在一起的答案,不包括只来自2的,只来自3的,还有22,33的情况。这里要注意,之前的题目是在一个集合里面搜索,startIndex是下一次搜索的位置。

2023-10-09 01:32:58 69

原创 Day20 力扣回溯 : 理论基础| 77. 组合

如果k是2, 3这样的数字,就可以考虑2、3层for循环直接做出来,但是如果k是50,很大的话,50层for循环就太暴力了,做不出来,这个时候就是用回溯,虽然它也是暴力算法,但是有时候暴力能解决就不错了,我理解这句话了。明白了,比如1234,k=3,那么对于根节点的for循环来说 已经找到的是0,还需找到的是4, 4-3+1, 就是2,最少也要从2开始。到了1这层for循环,已经找的1,还需要找2个, 4-2+1, 就是3,那么这层for循环,最多从3开始 (我好像理解那个最多了)就相当于234那个节点。

2023-10-07 23:49:39 61 1

原创 Day19 力扣二叉树 : 669. 修剪二叉搜索树 |108.将有序数组转换为二叉搜索树 | 538.把二叉搜索树转换为累加树 |二叉树总结

首先一定是二叉树的基本概念、二叉树类的写法每一道题都可以用递归去做,递归三部曲返回值?参数?单层递归逻辑?有一种确定返回值的方法,我还没有掌握参数一般比较简单单层递归逻辑是具体的题目了,也是较难。至于迭代法,一刷我还没有掌握,在层序遍历那里经常用有递归就有回溯,我理解回溯的过程,但是我还不能看到一类题就想到回溯,也不能看出隐藏的回溯,但是没关系,下一章节就是回溯,我体会一下。题的类型:直接来自代码随想录的总结。

2023-10-03 12:39:46 63

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

题目链接/文章讲解:https://programmercarl.com/0530.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E7%BB%9D%E5%AF%B9%E5%B7%AE.html。但是我们想象比如maxCount是2,count现在也是2,我们把val加入res,之后count变成3的时候,那我们就回进入第二个判断,清空res,再把count为3的加入,再更新maxCount。

2023-09-28 16:09:15 65

原创 Day17 力扣二叉树 :654.最大二叉树|617.合并二叉树 |700.二叉搜索树中的搜索|98.验证二叉搜索树

而关于这个maxValue的初始值,要保证它比最小的数还要小,要不然比较第一个数的时候,maxValue就比他大了就不合理了啊,就一个节点怎么还能不是二叉搜索树呢。比如[3,2,1] ,区间是[0, 3),最大值是 3, 那么index是0。本题是同样的道理,我们在寻找一个不符合条件的节点,如果没有找到这个节点就遍历了整个树,如果找到不符合的节点了,立刻返回。理解了过程,但是对双指针方法中,pre和root的移动我没明白,我觉得这只是对于左孩子而言,如果有右孩子,就不是判断pre比root小了啊。

2023-09-25 21:21:09 62 1

原创 Day16 力扣二叉树 :513.找树左下角的值|112. 路径总和|106.从中序与后序遍历序列构造二叉树

我觉得会犯这个错误是因为做这道题的思路是用target去减,就会觉得传入的应该是target啊,但其实如果用不断去加的思路去做,传入的应该是 root和root.val ,而不是root和0.这是错的,因为 path 函数做的事情是以 node 为根的子树有没有满足 sum 的一条路径,那么在计算第一个结点的时候,sum就应该加上这个节点的数值。这道题看一眼就感觉有回溯的味,加一下孩子节点,看看Sum是否满足要求,不满足的话退回到父节点的Sum,就是回溯的过程了,看一下题解吧。

2023-09-19 23:32:27 150

原创 Day15 力扣二叉树 :110.平衡二叉树 (优先掌握递归)|257. 二叉树的所有路径 (优先掌握递归)|404.左叶子之和 (优先掌握递归)

跟着题解敲了一遍,我也不理解java的答案中是midValue left right三个的和,但是c++的答案中是left right的两数和,我觉得两个代码的思路逻辑是一样的,差在哪里呢?:回溯和递归是一一对应的,有一个递归,就要有一个回溯,这么写的话相当于把递归和回溯拆开了, 一个在花括号里,一个在花括号外。我想层序遍历,但是返回的东西很奇怪,返回一个字符串列表,可能要用字符串的操作?那是因为代码的逻辑其实是求的根节点的高度,而根节点的高度就是这棵树的最大深度,所以才可以使用后序遍历。

2023-09-10 17:21:17 59 1

原创 Day14 力扣二叉树 : 104.二叉树的最大深度 (优先掌握递归)| 111.二叉树的最小深度 (优先掌握递归)|222.完全二叉树的节点个数(优先掌握递归)

那么求高度就是一个有些别扭的过程,它和正常地去遍历一个树是不一样的。所以考虑终止条件的时候,要想想 null 、叶子节点 和 这种一个孩子的节点情况,就比较清晰,因为它们都是终止时候的情况。所以考虑终止条件的时候,要想想 null 、叶子节点 和 这种一个孩子的节点情况,就比较清晰,因为它们都是终止时候的情况。整体代码和最大深度是一样的,但是有一个误区,最小深度是对于叶子节点来说的,而不是对于NULL节点来说的。后来想明白了,对于一个只有一个右孩子的节点来说,它不是满二叉树,就会递归它的左,递归它的右。

2023-08-21 18:48:18 59 1

原创 Day13 力扣二叉树 : 层序遍历| 226.翻转二叉树 (优先掌握递归|101. 对称二叉树 (优先掌握递归)

而链表的声明竟然是。

2023-08-16 18:41:23 83 1

原创 Day12 力扣二叉树 :理论基础 | 递归遍历 (必须掌握)| 迭代遍历 (迭代法可以放过)|统一迭代 (迭代法可以放过)

int val;

2023-08-14 16:11:20 33

原创 Day11 力扣栈与队列 : 239. 滑动窗口最大值 (一刷至少需要理解思路)|347.前 K 个高频元素 (一刷至少需要理解思路)|栈与队列总结

代码随想录里总结的不错,直接点链接去看吧。

2023-08-13 15:21:48 55 1

原创 Day10 力扣栈与队列 : 20. 有效的括号 | 1047. 删除字符串中的所有相邻重复项 | 150. 逆波兰表达式求值

20. 有效的括号讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。大家先自己思考一下 有哪些不匹配的场景,在看视频 我讲的都有哪些场景,落实到代码其实就容易很多了。题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html第一印象:  这是本科时候遇到过的一道题,但是已经没有印象了,只记得用栈,我没有自己想出有哪些不匹配的场景,直接看视频了。看完题解

2023-08-11 15:53:41 106 1

空空如也

空空如也

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

TA关注的人

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