自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 资源 (1)
  • 收藏
  • 关注

原创 代码随想录算法训练营第九天 | KMP更精良总结

字符串问题:寻找文本串S中是否存在模式串P。

2024-01-07 19:54:00 566 1

原创 代码随想录算法训练营第五十八天 | 单调栈

题目说如果不存在对应位置就输出 -1 ,所以result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。在遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过,因为最后是要根据nums1元素的下标来更新result数组。

2023-06-01 00:24:49 430 1

原创 代码随想录算法训练营第五十七天 | 回文

在判断字符串S是否是回文,那么如果我们知道 s[1],s[2],s[3] 这个子串是回文的,那么只需要比较 s[0]和s[4]这两个元素是否相同,如果相同的话,这个字符串s 就是回文串。如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子序列的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。dp[i] 和 dp[i-1] ,dp[i + 1] 看上去都没啥关系。整体上是两种,就是s[i]与s[j]相等,s[i]与s[j]不相等这两种。

2023-05-31 00:13:22 594

原创 代码随想录算法训练营第五十六天 | 编辑距离2

if (word1[i - 1] == word2[j - 1]) 说明不用任何编辑,那么就不用编辑了,以下标i-2为结尾的字符串word1和以下标j-2为结尾的字符串word2的最近编辑距离。基本相同,只要求出两个字符串的最长公共子序列长度即可,那么除了最长公共子序列之外的字符都是必须删除的,最后用两个字符串的总长度减去两个最长公共子序列的长度就是删除的最少步数。相同,此时不用增删元素。:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。

2023-05-29 23:52:17 892

原创 代码随想录算法训练营第五十五天 | 编辑距离

例如: s:bagg 和 t:bag ,s[3] 和 t[2]是相同的,但是字符串s也可以不用s[3]来匹配,即用s[0]s[1]s[2]组成的bag。同理从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],那么遍历顺序也应该是从上到下,从左到右。这里大家要明确,我们求的是 s 中有多少个 t,而不是 求t中有多少个s,所以只考虑 s中删除元素的情况,即 不用s[i - 1]来匹配 的情况。所以当s[i - 1] 与 t[j - 1]相等时,

2023-05-29 00:13:35 607

原创 代码随想录算法训练营第五十三天 | 子序列系列2

如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。主要就是两大情况: text1[i - 1] 与 text2[j - 1]相同,text1[i - 1] 与 text2[j - 1]不相同。dp[0]应该是多少呢?根据dp[i]的定义,很明显dp[0]应为nums[0]即dp[0] = nums[0]。

2023-05-26 23:19:25 482

原创 代码随想录算法训练营第五十二天 | 子序列系列

若nums[i] > nums[i - 1],那么【以 i为结尾的连续递增子序列长度dp[i] 】等于【以i - 1为结尾的连续递增子序列长度dp[i-1] 】+ 1。若nums[i] > nums[j],【位置i的最长升序子序列长度dp[i]】等于【j从0到i-1各个位置的最长升序子序列长度dp[j]】+ 1 的最大值;因为本题要求连续递增子序列,所以就只要比较nums[i]与nums[i - 1],而不用去比较nums[j]与nums[i] (j是在0到i之间遍历)。所以dp[i]应该初始1;

2023-05-26 00:10:11 572

原创 代码随想录算法训练营第五十一天 | 买卖股票3

本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。状态:dp定义看的文档,可以根据定义写完后面的。确定递推公式(直接根据下面这张图可以退出),第i天状态为j,所剩的最多现金为。确定dp数组以及下标的含义。状态:能直接做出来。

2023-05-24 23:56:47 579

原创 代码随想录算法训练营第五十天 | 买卖股票2

现在最大的时候一定是卖出的状态,而两次卖出的状态现金最大一定是最后一次卖出。第二次买入依赖于第一次卖出的状态,其实相当于第0天第一次买入了,第一次卖出了,然后再买入一次(第二次买入),那么现在手头上没有现金,只要买入,现金就做相应的减少。外层for循环里面的2k种状态,再用一个for循环实现即可,注意这里的相邻两个状态为一组,有规律。从递归公式其实已经可以看出,一定是从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。中 i表示第i天,j为 [0 - 4] 五个状态,第0天做第一次买入的操作,

2023-05-23 22:54:47 543

原创 代码随想录算法训练营第四十九天 | 买卖股票

状态2:第i天买入这支股票,此时就变成持有股票的状态,买入股票就要花钱,所以现金为【0-price[i]】状态2:在第i天卖出这支股票,此时变成不持有股票的状态,那么第i-1天一定是持有这支股票的状态,此时。表示第0天持有股票,此时的持有股票就一定是买入股票了,因为不可能有前一天推出来,所以。表示第i-1天也不持有股票的状态,可能前几天就卖了,一直保持着不持有的状态,此时。,第i-1天到第i天延续着持有股票的状态,那么现金就没有改变,此时。状态1:第i天之前就买了股票,第i-1天也可以持有股票即。

2023-05-22 23:47:37 517

原创 代码随想录算法训练营第四十八天 | 树形dp

只能。

2023-05-22 10:50:25 476

原创 代码随想录算法训练营第四十六天 | bool的背包题,细节多

代码随想录 (programmercarl.com)

2023-05-19 22:22:41 508

原创 代码随想录算法训练营第四十五天 | dp最小值题目

凑足总额为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]都要选最小的,下标非0的dp[i]初始化为0,因为dp[i]是靠dp[i-j]累计上来的,dp[i]本身为0这样才不会影响结果。

2023-05-19 00:05:37 470

原创 代码随想录算法训练营第四十四天 | 完全背包、完全背包的遍历顺序

*对于纯完全背包问题,其for循环的先后循环是可以颠倒的!**但如果题目稍稍有点变化,就会体现在遍历顺序上。如果问装满背包有几种方式的话?那么两个for循环的先后顺序就有很大区别了,而leetcode上的题目都是这种稍有变化的类型。

2023-05-18 21:20:20 669

原创 代码随想录算法训练营第四十三天 | 填满背包有几种方法、背包有两个维度

代码随想录 (programmercarl.com)动态规划之背包问题,这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II_哔哩哔哩_bilibili状态:没想到。思路本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小这样就化解成01背包问题了。两堆重量不一定相等,比如总重量为X,如果分开后两堆重量正好都为X/2,则为0;如果分开后两堆重量为Y和Z(假设Y

2023-05-17 23:50:30 442 1

原创 代码随想录算法训练营第四十二天 | 背包问题

首先从。

2023-05-17 00:44:14 457

原创 代码随想录算法训练营第四十一天 | 一层for过渡到两层for

这是因为之前 j=1 时,dp[6] = 1 x dp[5] = 1 x 1 x 1 x 1 x 1已经出现过把2拆分的情况了,所以是为了不重复拆分。比如 i=6,dp[6] = 2 x dp[4] = 2 x 1 x 1 x 1 x1,此时j=2,那么有个问题:为什么不拆分j,即为什么不拆分2?如果要找递归公式,先从n=1,2,3把图画出,看里面的规律,即利用dp[1]和dp[2]推导出dp[3]。只初始化dp[2] = 1,从dp[i]的定义来说,拆分数字2,得到的最大乘积是1,这个没有任何异议!

2023-05-15 22:47:11 387

原创 代码随想录算法训练营第三十九天 | 不同路径(挺简单的)

这里要看一下递推公式dp[i[j] = dp[i - 1[j] + dp[i[j - 1],dp[i[j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。那么很自然,dp[i[j] = dp[i - 1[j] + dp[i[j - 1],因为dp[i[j]只有这两个方向过来。想要求dp[i[j],只能有两个方向来推导出来,即dp[i - 1[j] 和 dp[i][j - 1]。递推公式和62.不同路径一样,dp[i[j] = dp[i - 1[j] + dp[i[j - 1]。

2023-05-12 21:08:39 648

原创 代码随想录算法训练营第三十八天 | 动态规划基础流程

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

2023-05-11 23:36:05 403

原创 代码随想录算法训练营第三十七天 | 两道难题,很有意义

状态:太难了,要对二叉树有很深的理解。所以12534对应的结果为12499。对于数字(eg. 12534),我的思路(感觉文档思路不好用)(eg. 12),那么,

2023-05-10 22:41:56 538

原创 代码随想录算法训练营第三十六天 | 重叠区间

此时问题就是要求非交叉区间的最大个数。这里记录非交叉区间的个数还是有技巧的,如图:区间,1,2,3,4,5,6都按照右边界排好序。当确定区间 1 和 区间2 重叠后,如何确定是否与 区间3 也重贴呢?就是。

2023-05-09 22:01:19 772

原创 代码随想录算法训练营第三十五天 | 两维贪心、重叠区间

但使用vector是非常费时的,C++中vector(可以理解是一个动态数组,底层是普通数组实现的)如果插入元素大于预先普通数组大小,vector底部会有一个扩容的操作,即申请两倍于原先普通数组的大小,然后把数据拷贝到另一个更大的数组上。**如果把气球排序之后,从前到后遍历气球,被射过的气球仅仅跳过就行了,没有必要让气球数组remove气球,只要记录一下箭的数量就可以了。按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。

2023-05-08 22:20:56 510

原创 代码随想录算法训练营第三十四天 | 加油站题、左右贪心

i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。文档讲解:https://programmercarl.com/0135.%E5%88%86%E5%8F%91%E7%B3%96%E6%9E%9C.html#%E6%80%9D%E8%B7%AF。看视频讲解会比较直观。状态:暴力思路有,贪心思路没有。

2023-05-07 21:57:03 515

原创 代码随想录算法训练营第三十二天 | 利润题、覆盖范围题

i每次移动只能在cover的范围内移动,每移动一个元素,cover得到该元素数值(新的覆盖范围)的补充,让i继续移动下去。而cover每次只取 max(该元素数值补充后的范围, cover本身范围)。如果cover大于等于了终点下标,直接return true就可以了。代码。

2023-05-05 23:52:31 479

原创 代码随想录算法训练营第三十一天 | 贪心1,想不到怎么找局部最优就做不出来

其实并不会,因为还有一个变量result 一直在更新 最大的连续和,只要有更大的连续和出现,result就更新了,那么result已经把4更新了,后面 连续和变成3,也不会对最后结果有影响。上面代码中,可以看出来,是先遍历的胃口,在遍历的饼干,那么可不可以 先遍历 饼干,在遍历胃口呢?图中,我们可以看出,上面的代码在三个地方记录峰值,但其实结果因为是2,因为 单调中的平坡 不能算峰值(即摆动)。这种写法,两个循环的顺序改变了,先遍历的饼干,在遍历的胃口,这是因为遍历顺序变了,我们是从小到大遍历。

2023-05-05 00:02:29 495

原创 代码随想录算法训练营第三十天 | 航班问题、二维回溯

代码随想录 (programmercarl.com)

2023-05-03 23:26:13 916

原创 代码随想录算法训练营第二十九天 | 递增子序列(新的树层去重)、排列、排列中树枝树层去重

每层都是从0开始搜索而不是startIndex需要used数组记录path里都放了哪些元素了。

2023-05-03 00:08:39 488

原创 代码随想录算法训练营第二十八天 | 三个逗点四个子串的类型题、子集题要取所有节点、子集与树层去重

pointNum表示逗点数量,

2023-05-02 13:30:20 416

原创 代码随想录算法训练营第二十五、二十七天 | 细节很多、树枝去重和树层去重的区分是难点、分割

代码随想录 (programmercarl.com)

2023-05-01 00:40:21 525

原创 代码随想录算法训练营第二十四天 | 回溯理论、组合

从下图中红线部分可以看出,在集合[1,2,3,4]取1之后,下一层递归,就要在[2,3,4]中取数了,那么下一层递归如何知道从[2,3,4]中取数呢,靠的就是startIndex。第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。可以看出这棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不再重复取。此时递归的层数大家应该知道了,例如:n为100,k为50的情况下,就是递归50层。

2023-04-27 23:08:48 153

原创 代码随想录算法训练营第二十三天 | 修剪二叉搜索树很难,考验递归本质

代码随想录 (programmercarl.com)

2023-04-27 00:54:05 220

原创 代码随想录算法训练营第二十二天 | 这些题目都靠小技巧解决,要记住

本周小结!(二叉树系列四) | 代码随想录 (programmercarl.com)

2023-04-26 00:46:08 110

原创 代码随想录算法训练营第二十一天 | 二叉树遍历上双指针、有返回值时区分搜索一条边还是整个树

二叉树遍历上双指针状态:递归和迭代都能做出来。好题。。思路,二叉搜索树可是有序的。遇到。中序遍历时,需要用一个pre节点记录一下cur节点的前一个节点,如图,递归中序代码迭代中序代码tips:看到二叉搜索树,要时刻牢记“状态:普通法能想出来。双指针法大框架想出来了,小细节想错了。

2023-04-25 01:15:07 141

原创 代码随想录算法训练营第二十天 | 同时操作两棵二叉树、二叉搜索树

对比我的代码和文档代码:文档代码不让空节点进入递归,所以其终止条件,是遇到叶子节点就终止,所以加了if判断。我的代码允许空节点进入递归,所以其终止条件,是遇到空节点,也就是数组区间为0,就终止了,所以没加if判断。什么时候递归函数前面加if,什么时候不加if?其实就是不同代码风格的实现,

2023-04-24 01:10:24 130

原创 代码随想录算法训练营第十八天 | 找树左下角的值、路径总和、利用前中后序构造二叉树

找到。

2023-04-22 18:32:10 194

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

本周小结!(二叉树系列二) | 代码随想录 (programmercarl.com)

2023-04-21 01:14:13 153

原创 代码随想录算法训练营第十六天 | 二叉树的最大深度、最小深度、完全二叉树的节点个数

方法1:迭代法(层序遍历)

2023-04-20 01:58:19 131

原创 代码随想录算法训练营第十五天 | 层序遍历、翻转二叉树、对称二叉树

*正是因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。因为要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。如上代码中,我们可以看出使用的遍历方式,左子树左右中,右子树右左中,所以我把这个遍历顺序也称之为“后序遍历”(尽管不是严格的后序遍历)。对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了。那么遍历的顺序应该是什么样的呢?

2023-04-19 21:56:01 189

原创 代码随想录算法训练营第十四天 | 二叉树前中后序的递归遍历与迭代遍历

可以看出前序和中序是完全两种代码风格,并不像递归写法那样代码稍做调整,就可以实现前后中序。这是因为前、后序遍历中访问节点(遍历节点)和处理节点(将元素放进result数组中)可以同步处理,但是中序就无法做到同步!那么问题又来了,难道 二叉树前后中序遍历的迭代法实现,就不能风格统一么(即前序遍历 改变代码顺序就可以实现中序 和 后序)?当然可以,这种写法还不是很好理解,不想学这种方法,避免混乱;需要的话,可以参照代码随想录 (programmercarl.com)。

2023-04-18 00:51:31 200

原创 代码随想录算法训练营第十三天 | 单调队列解决滑动窗口、优先级队列实现大小顶堆

比如队列元素为map,就可以自定义是根据key比较,还是根据value比较,可以自定义是降序或者升序。那么它是如何有序排列的呢?缺省情况下priority_queue利用max-heap(大顶堆)完成对元素的排序,这个大顶堆是。

2023-04-17 00:40:11 292

空空如也

空空如也

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

TA关注的人

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