自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录一刷last day|84.柱状图中最大的矩形

后来想明白:每次我们只会弹出一个元素即mid来计算,因此参与面积计算的就是当前遍历到的柱形和被弹出的柱形,所以要以被弹出的柱形的高度作为面积的高,如果满足st非空且当前元素小于栈头元素,那么会一直弹出栈里的元素。因为,接雨水那道题需要找某一列左右两边第一个高于该列的,而本题要找某一列左右两边第一个低于该列的,正好相反。在头部加上0的目的是为了防止height数组是降序数组的时候如[8,4,3,2]在尾部加上0的目的是为了防止height数组是升序数组的时候如[2,3,4,8]此时大家应该可以发现其实就是。

2023-09-29 18:58:56 167

原创 代码随想录|503.下一个更大元素II,42.接雨水(大厂面试经典)

本题跟题目739类似,唯一不同的是要记录的是下一个更大元素了,而不是下标,而且添加了循环数组。2.如果当前元素等于栈头元素,那么我们先pop栈头元素再push当前元素;3.如果当前元素大于栈头元素,我们先计算能接到的雨水体积再push当前元素。本题将单调栈与循环数组结合起来,可以把数组看成是原来的两倍相当于模拟循环。求出每一列可以接收多少雨水,第一列和最后一列无法接收雨水,1.如果当前元素小于栈头元素,那么直接push当前元素;

2023-09-29 17:28:02 152

原创 代码随想录之单调栈|739. 每日温度,496.下一个更大元素 I

如果当前元素大于栈顶下标对应的元素,说明就是在nums2中找到了第一个更大的,这时对栈进行非空判断,如果当前nums2栈顶元素也在map中出现的话,说明是nums1需要的,我们找到这个元素在nums1的下标位置index,这时候把当前遍历下标对应的元素值 赋值给index。如果当前元素小于等于栈顶下标对应的元素,说明当前元素不是要寻找的第一个更大,直接将其下标入栈;上面有点绕,总而言之,就是在nums2中寻找nums1中元素的右边最大,其次遍历nums2数组:注意栈存放的是nums2元素的下标,是下标!

2023-09-24 18:50:07 172

原创 代码随想录|647. 回文子串,516.最长回文子序列

代码实现。

2023-09-24 15:38:19 117

原创 动态规划之编辑距离总结篇体会到carl的用心良苦

给定字符串和,判断是否为的子序列。这道题可以用双指针也可以用动规,关于动规:当s[i - 1] 与 t[j - 1]相等时, dp[i][j]=dp[i-1][j-1]+1;当s[i-1]和t[j-1]不相等时,,继续匹配,所以dp[i][j]=dp[i][[j-1]

2023-09-24 13:10:53 49

原创 代码随想录|583. 两个字符串的删除操作,72. 编辑距离(有进一步理解到)

1.dp含义dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。2.dp递推公式dp[i][j - 1] + 1 ,因为要做的是同时删除word1[i-1]和word2[j-1],dp[i][j-1]本来就不考虑word2[j-1]了,那么我在删除word1[i-1]是不是就能达到两个元素都删除的效果了,即3.dp初始化从递推公式中,可以看出来,dp[i][0] 和 dp[0][j]是一定要初始化的。

2023-09-24 11:38:10 72

原创 代码随想录|392.判断子序列,115.不同的子序列(需要二刷)

从递推公式dp[i][j]=dp[i-1][j]和dp[i][j]=dp[i-1][j-1]+dp[i-1][j]来看,dp[0][0]应该是1,空字符串s,可以删除0个元素,变成空字符串t。dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],dp[0][0]表示两个空字符串相同子序列的长度,dp[i][0]表示下标为i-1的字符串s与空字符串t的相同子序列的长度,所以dp[0][0],dp[i][0]都初始化为0。4.遍历顺序从前往后。

2023-09-23 11:18:00 47

原创 代码随想录|1143.最长公共子序列,1035.不相交的线,53. 最大子序和(贪心或动规实现)

否则,我们需要在dp[i][j]记录下之前遍历到text1的前一个字符串或者text2的前一个字符串中公共字符串长度的较大者,即Math.max(dp[i-1][j],dp[i][j-1])dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]。从递推公式可以看出dp[i]是依赖于dp[i-1]状态,dp[0]就是递推公式基础,跟据dp含义dp[0]=nums[0]dp[i]表示包括下标i的最大连续子序列和为dp[i]

2023-09-22 23:56:32 25

原创 代码随想录|300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组(非常不理解了)

本题中,正确定义dp数组的含义十分重要。

2023-09-20 20:29:26 38

原创 代码随想录|121. 买卖股票的最佳时机,122.买卖股票的最佳时机II,123.买卖股票的最佳时机III,188.买卖股票的最佳时机IV

那么dp[0][0]表示第0天持有股票,此时的持有股票就一定是买入股票,因为不可能有前一天推出来,所以dp[0][0]=-prices[0]同样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][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。

2023-09-17 21:17:58 46

原创 代码随想录|198.打家劫舍,213.打家劫舍II, 337.打家劫舍 III

3.状态标记递归// 执行用时:0 ms , 在所有 Java 提交中击败了 100% 的用户// 不偷:Max(左孩子不偷,左孩子偷) + Max(又孩子不偷,右孩子偷)// 偷:左孩子不偷+ 右孩子不偷 + 当前节点偷代码实现。

2023-09-15 00:16:03 144

原创 代码随想录第41天| 343.整数拆分,96.不同的二叉搜索树

这道题全程懵逼。

2023-09-10 15:06:00 76

原创 代码随想录第46天|139.单词拆分,了解多重背包,背包总结

核心五步确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组01背包问题,跟416 分割等和子集很像,先遍历物品再倒序遍历背包。

2023-09-10 14:58:14 126

原创 代码随想录第45天|70. 爬楼梯,322. 零钱兑换,279.完全平方数

凑足金额为j-coins[i]的最少个数是dp[j-coins[i]],那么只需加上一个钱币coins[i]即dp[j-coins[i]]+1就是dp[j],所以dp[j]要取所以dp[j-coins[i]]+1中最小的。递推公式:dp[j]=min(dpp[j-coins[i]]+1,dp[j]);这道题的时候卡住了,一开始在for循环里面是写的if(coins[i]<=j)这个条件,然后出现下面用例报错: 后面优化成 if (dp[j - coins[i]]!所以下标非-元素都应该是最大值。

2023-09-10 11:25:34 184

原创 代码随想录第44天|完全背包,377. 组合总和 Ⅳ,518.零钱兑换II

这个简单的完全背包问题,估计就可以难住不少候选人了。

2023-09-10 00:02:28 34

原创 代码随想录第43天|416. 分割等和子集,1049. 最后一块石头的重量 II, ​494.目标和,​ 474.一和零(一窍不通)

思路本题是01背包的应用题动态五部曲:1.确定dp数组以及下标的含义dp[j] 表示: 容量为j的背包,所背的物品价值最大可以为dp[j]。本题中物品重量是nums[i],物品价值也是nums[i]那么如果背包容量为target, dp[target]就是装满 背包之后的重量,所以 当 dp[target] == target 的时候,背包就装满了。2.确定递推公式3.dp数组如何初始化本题初始化为0就可以了4.确定遍历顺序。

2023-09-09 20:42:05 102

原创 代码随想录|二维数组的01背包问题,优化-一维数组的01背包问题

一维的dp的for循环顺序不可以反过来写,必须for循环先遍历物品再遍历背包(如果换了这个顺序,那么造成的结果是每个容量的背包只会被放入一个物品),而且需要倒序遍历背包(如果正序遍历背包的话一个物品会被放置多次)注意以上问题都是在候选人把代码写出来的情况下才问的。

2023-09-09 16:11:54 307

原创 代码随想录第40天|62.不同路径,63. 不同路径 II

到达右下角那格的路径数量要么是从上来的,要么是从左来的dp[i][j]含义:表示到达(i,j)的路径数初始化:因为题目说明了只能往下或者往右走,所以第一行和第一列初始化为1代码实现。

2023-09-04 21:46:58 164

原创 代码随想录第38天|509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯,动态规划开始啦!!

然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。

2023-09-03 00:22:12 222

原创 738.单调递增的数字 ,968.监控二叉树 +贪心总结

968.监控二叉树 (一刷跳过)738.单调递增的数字示例:如将322变成成单调递增的最大数字即299,如3442变成3399首先要将n转换成字符数组,其次遍历数组进行两次判断:第一次是遍历数字时求当前最大的数字max。然后只在max<arr[i]的时候才更新max和对应的下标idx第二次要判断是否有arr[i]>arr[i+1],如果是那么要将arr[idx]减1,同时将之后的位数都替换成'9'代码实现968.监控二叉树 (一刷跳过)贪心总结。

2023-09-02 23:10:24 198

原创 代码随想录第36天|435. 无重叠区间 (需要二刷),763.划分字母区间,56. 合并区间

435. 无重叠区间。

2023-09-02 15:57:05 115

原创 代码随想录第35天|860.柠檬水找零 , 406.根据身高重建队列(很多细节点注意一下),452. 用最少数量的箭引爆气球

860.柠檬水找零思路比较简单。

2023-09-02 14:03:28 75

原创 代码随想录训练营第34天|1005. K 次取反后最大化的数组和, 134. 加油站,135.分发糖果 (需要二刷)

根据题目给出数组元素的范围为【-100,100】,所以可以新建一个数组number把nums的元素映射到number数组中,然后遍历number数组找到最小数字,如果把所有负数都取反后k还是>0,那么就要将最小的正数取反,这个地方要注意正数在number的映射是大于100的,要取反应该重新调整i的位置,即i=200-i;方便后面的求和运算代码实现这里有1个坑 :这种情况,因为最小值是正数的,在while循环后i的大小就停止了所以要加上这段代码纠正i的位置出现的错误:画图理解。

2023-09-02 00:02:13 30

原创 代码随想录第32天|122.买卖股票的最佳时机 II,55. 跳跃游戏 ,45. 跳跃游戏 II

思路比较简单。

2023-08-27 18:20:28 75

原创 代码随想录第31天|认识贪心算法,455.分发饼干,376. 摆动序列,53.最大子数组和

贪心的本质是选择每一阶段的局部最优,从而达到全局最优。例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?指定每次拿最大的,最终结果就是拿走最大数额的钱。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。再举一个例子如果是有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满,如果还每次选最大的盒子,就不行了。这时候就需要动态规划。因为每次取最大体积的盒子可能导致最终背包有部分位置是空闲的,就无法装满整个背包。

2023-08-27 16:53:22 78

原创 8/26 回溯法 周总结 记录个人的想法

3.递归逻辑:这里涉及到去重操作,引入一个used数组,因为同一树层不可以有相同元素,但是同一树枝可以有,我们通过used[i-1]来判断是在树枝还是树层遍历了相同元素,如果used[i-1]是false说明就是同一树层,否则说明是在树枝。1.递归函数参数和返回值,注意这道题可以先对nums数组进行排序,然后参数中含有startIndex,如果是有序数组,那么再遍历到一处是path元素之和大于target,那么后面就都不用考虑了。:和79题区别是nums可能包含重复元素,求不重复的所有子集(包括空集)。

2023-08-26 20:48:45 138

原创 代码随想录第29天|491.递增子序列,46.全排列,47.全排列II

这道题的特点是有序的子序列(不能对原数组排序),最终结果集res不能有重复子集。所以这道题又是子集又是去重。

2023-08-26 14:15:57 87

原创 代码随想录第28天|93. 复原 IP 地址,78.子集, 90.子集II

从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集!情况就不同了,本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。的区别是也可以不使用used数组来去重,因为递归的时候下一个startIndex是i+1而不是0。其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。就是startIndex已经大于数组的长度了,就终止了,因为没有元素可取了,

2023-08-23 23:13:06 88

原创 代码随想录第27天|39. 组合总和,40.组合总和II,131.分割回文串

回溯三部曲:1.递归函数参数和返回值2.递归终止条件3.单层搜索的逻辑。

2023-08-21 23:00:14 124

原创 代码随想录第25天|216.组合总和III ​​​​​​​,17. 电话号码的字母组合

来举一个例子,n = 4,k = 4的话,那么第一层for循环的时候,从元素2开始的遍历都没有意义了(不足k个)。首先要遍历digits的每一个数字,一个数字对应一个字符串str,如digits=“23”,可以得到str1=“abc”,str2=“def”,我们求str1和str2的所有组合。举个例子,n = 4,k = 3, 目前已经选取的元素为0(path.size为0),n - (k - 0) + 1 即 4 - ( 3 - 0) + 1 = 2。遍历的范围是可以剪枝优化的,怎么优化呢?

2023-08-19 18:50:24 86

原创 8/18二叉树的总结

二叉树的总结

2023-08-18 20:37:21 284

原创 代码随想录第24天|初步了解回溯三部曲

回溯是递归的副产品,只要有递归就会有回溯。。提到了回溯法的效率,回溯法其实就是暴力查找,并不是什么高效的算法。最后我们讲到回溯法解决的问题都可以抽象为树形结构(N叉树),并给出了回溯法的模板。

2023-08-18 17:55:46 89

原创 代码随想录第23天|669. 修剪二叉搜索树 ,108.将有序数组转换成(平衡)二叉搜索树 , 538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树思路1.确定终止条件修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。2.确定单层递归的逻辑:如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。3.接下来要将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。最后返回root节点代码实现。

2023-08-17 16:30:43 55

原创 代码随想录第22天|235.二叉搜索树的最近公共祖先,701. 二叉搜索树中的插入操作, 450.删除二叉搜索树中的节点

今天都是涉及对BST的操作235.递归后序遍历,寻找root.val是否在目标区间[p.val,q.val]之间,是则直接return root;否则继续递归701.将值插入到BST中,如果当前节点root==null,说明我们找到了要插入的位置,直接return newnode;否则(根据给定val和root.val的比较)继续递归左子树和递归右子树450.大体递归框架和701是一样的,但是在处理root.val=val的情况下又分了五种情况考虑,思考的点是要如何处理要删除的节点的左右子树。

2023-08-16 16:05:43 61

原创 代码随想录算法训练营第十九天|530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数 ,236. 二叉树的最近公共祖先 (二刷)

处理中间节点逻辑:比较当前节点值和当前节点的前一个节点值是否相等,如果相等计数器count++,同时我们将count与记录最大频数的maxCount比较,确定是否需要更新maxCount。思路:二叉树搜索树(BST)是有序的,题目要寻找的众数可能不是唯一的,因此我们需要遍历二叉树把符合要求的数值放入结果列表resList,最后将结果列表转换成数组。思路,二叉搜索树是有序的,所以我们可以有序遍历树dfs中序遍历,记录当前节点的值及其前一个节点的值进行比较,我们使用了pre指针和当前指针root指针的技巧。

2023-08-15 20:48:43 28

原创 代码随想录算法训练营第十八天|654.最大二叉树, 617.合并二叉树, 700.二叉搜索树中的搜索,98.验证二叉搜索树

思路:递归,这道题和利用中序和后序数组构造树以及利用前序和中序数组构造树两道题类似,终止条件:当遍历数组的范围为0,直接返回null 或只有一个元素则返回这个元素单层递归逻辑:我们每次需要找到nums数组中的最大值,根据最大值节点划分左右子树,对左右子树传入通过最大值划分好的区间索引进行dfs代码实现。

2023-08-14 19:45:00 257

原创 8.13树的总结(有新知识再更新)

二叉树的高度是指从根节点到最远叶子节点的最长路径上经过的边的数量。一个节点的深度指的是从根节点到该节点的唯一路径上经过的边的数量。根节点的深度为0,它的子节点的深度为1,以此类推。因为递归一层一层对我来说有点绕,主要感悟就是只针对某一个节点思考,把属于这个节点的逻辑思考清楚(就是确认好单层递归的逻辑就可以了)对于每一个节点,它的左子树的值都小于根节点的值,右子树的值都大于根节点的值,同时左子树和右子树也是二叉搜索树。一棵二叉树只有度为0和度为2的节点,且度为0的节点在同一层上,那么此树为满二叉树。

2023-08-13 12:34:35 97

原创 代码随想录算法训练营第十七天|110.平衡二叉树 ,257. 二叉树的所有路径 ,404.左叶子之和

思路:分别求出每个节点其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。

2023-08-13 11:40:39 121

原创 代码随想录算法训练营第十八天| 513.找树左下角的值,112.路径总和 ,113.路径总和 II,106.从中序与后序遍历序列构造二叉树(值得二刷),105.从前序与中序遍历序列构造二叉树

513.找树左下角的值递归法+回溯寻找最大深度,当遇到叶子节点,要判断一下是否需要更新最大深度迭代法,也叫BFS,返回每一层最左边的元素(也是第一个元素即i=0时)

2023-08-13 11:35:48 25

原创 代码随想录算法训练营第十四天|对树的初步认识

在我们解题过程中二叉树有两种主要的形式:满二叉树和完全二叉树。

2023-08-10 21:12:32 242

空空如也

空空如也

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

TA关注的人

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