- 博客(50)
- 收藏
- 关注
原创 代码随想录算法训练营第六十天| 84.柱状图中最大的矩形
虽然只有60天的刷题时间,但这段经历充满了曲折。从最初的激情到中途的疲惫,再到后来习惯的形成,如果没有这个训练营和陪我一起刷题的小伙伴,我可能还在每天挣扎刷题的阶段。解决每一种题目的关键在于掌握它想考察的核心思想和解题的关键方法。以回溯法为例,虽然N皇后问题看起来很复杂,但只要掌握了回溯的基本步骤,明确每个环节,代码实现就顺其自然了。一种题型的解题方法常常可以启发解决其他题型,即使是难题,也不过是基础题型的变体而已。因此,从简单题开始逐步提升的策略也是非常有效的。刷题时最忌讳的是对问题一知半解。
2023-11-30 22:06:32 278
原创 代码随想录算法训练营第五十九天| 503.下一个更大元素II 42. 接雨水
状态:看了视频题解和文章解析后做出来了503.下一个更大元素II这道题和每日温度非常相似,只不过这次的数组是头接尾的,也就是说后面的元素也可以视前面的元素为比自己大的元素。第一种方法是复制一个nums数组然后和原数组拼接在一起,最后把res resize成原来的大小,虽然最后的resize复杂度为O(1),但扩充数组的复杂度就是O(n)了,不太值得。比较好的一种方式是循环这个数组两遍,所以在for循环的range里,使用的是len(nums) * 2。
2023-11-30 03:57:59 218
原创 代码随想录算法训练营第五十七天| 739. 每日温度 496.下一个更大元素 I
栈内要保存的,是下标,这样在对比栈头的时候直接取temperature[stack[-1]],在计算结果的时候也可以简单的用 i - stack[-1]。代码随想录PDF,代码随想录百度网盘,代码随想录知识星球,代码随想录八股文PDF,代码随想录刷题路线,代码随想录知识星球八股文。因为我们要找到第一个比自己温度高的天数,所以栈内只有是递减的才能保证栈内都是还没有找到比自己温度更高的天数,这样符合题意。如果是单调递增的栈,为什么不直接出栈呢,毕竟栈内已经有比你温度高的元素了。496.下一个更大元素 I。
2023-11-29 00:39:40 175
原创 代码随想录算法训练营第五十六天| 647. 回文子串 516.最长回文子序列
3. 情况三:下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true。当s[i]与s[j]相等,dp[i][j] = dp[i+1][j-1] + 2,这是因为如果i 和 j(视为两端的下标)的元素一样,那么他们区间内的最大回文长度取决于 [i+1, j-1]区间的回文数数量 + 2。
2023-11-28 02:52:38 199
原创 代码随想录算法训练营第五十四天|392.判断子序列 115.不同的子序列
从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],所以dp[0][0]和dp[i][0]是一定要初始化的。dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]第一种情况:s和j的元素相等,dp[i][j] 在 dp[i-1][j-1] 的基础上 + 1。dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。1. 确定dp数组的含义。
2023-11-25 01:29:34 334
原创 代码随想录算法训练营第五十二天|300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组
但dp[i][0] 和dp[0][j]要初始值,因为 为了方便递归公式dp[i][j] = dp[i - 1][j - 1] + 1;dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。即当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;根据dp[i][j]的定义,dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。其中i是当前元素,j是i之前的某个元素。
2023-11-23 22:38:53 119
原创 代码随想录算法训练营第四十五天| 139.单词拆分
从递推公式中可以看出,dp[i] 的状态依靠 dp[j]是否为true,那么dp[0]就是递推的根基,dp[0]一定要为true,否则递推下去后面都都是false了。如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。
2023-11-17 09:13:51 112
原创 代码随想录算法训练营第四十二天| 1049. 最后一块石头的重量 II 494. 目标和
时间复杂度:O(n^2)空间复杂度:O(n)首先这道题和上一道石头题的解法类似,把石头堆分为总和尽可能接近的两组,然后对撞就得到最小的重量了。dp[j]代表背包重量为j时可以放入的最大价值,因为重量和价值在石头问题中等价,所以也可以说是最大的重量。01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);本题,相当于背包里放入数值,那么物品i的重量是stones[i],其价值也是stones[i]。
2023-11-14 12:19:32 70
原创 代码随想录算法训练营第四十天| 343. 整数拆分 96.不同的二叉搜索树
状态:看了视频题解和文章解析后做出来了343. 整数拆分dp[i]为分拆数字i,可以得到的最大乘积有两种拆分逻辑:(1)分拆成两个数字,计算乘积。比如10分拆成4*6=24(2)利用dp分拆成至少3个数字的乘积,比如10分拆成dp[4] * 6,而dp[4]是2*2,所以实际上是2*2*6=24取这两种方式乘积的较大值,作为当前dp[i]的拆分最大乘积。所以dp[i] = max(dp[i], (i-j) * j, dp[i-j] * j)
2023-11-10 23:26:07 52
原创 代码随想录算法训练营第三十六天| 738.单调递增的数字
从局部最优推导到全局最优,如果举不出反例,就试试贪心。解贪心算法的题目,没有一个固定的逻辑和规律,全凭直觉的一定的数学思想。几种比较经典的类型:1. 区间融合/去重:一般为从左到右遍历,比较当前左区间和之前最小右区间。2. 分发饼干/柠檬水找零:从最大/最小入手,比如先分发最大的饼干给胃口最大的孩子,先从最大的零钱(10块钱)开始找零。从最极端的情况开始遍历,往往能推到全局最优。3. 分发糖果/身高重建队列:这种题目一般有两个维度需要考虑。
2023-11-07 23:00:59 137
原创 代码随想录算法训练营第三十二天| 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
状态:看了视频题解和文章解析后做出来了。
2023-11-05 01:22:43 38
原创 代码随想录算法训练营第三十一天| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
状态:看了视频题解和文章解析后做出来了1005.K次取反后最大化的数组和这道题确实比较好想,给定一个整数数组和一个整数k。将数组中的任意单一元素取相反数k次,使得新数组的总和最大。如果数组为[2,3,-4,1],很显然第一次要取相反数的就是 -4,这样里外里就使总和增加了8.数组变为[2, 3, 4, 1],这时候要是再翻转,因为都是正数了,为了保证总和最大,肯定要翻转最小的数字,也就是1.数组变为[2, 3, 4, -1],要是再翻转,显然就是-1了,-1又刚好是当前数组内最小的数字。
2023-11-03 23:13:47 135
原创 代码随想录算法训练营第二十九天| 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II
状态:看了视频题解和文章解析后做出来了122.买卖股票的最佳时机II这道题的贪心点在于,只需要计算每两天之间的profit,再汇总是+的profit就得出全局最优。注意第一天因为没有买入点所以没有profit。时间复杂度:O(n)空间复杂度:O(1)
2023-11-03 06:53:32 30
原创 代码随想录算法训练营第二十二天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
状态:看了视频题解和文章解析后做出来了。
2023-10-27 06:13:54 38 1
原创 代码随想录算法训练营第二十一天| 236. 二叉树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
状态:看了视频题解和文章解析后做出来了。
2023-10-26 02:21:59 42 1
原创 代码随想录算法训练营第二十天| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
状态:看了视频题解和文章解析后做出来了。
2023-10-25 06:25:32 50 1
原创 代码随想录算法训练营第十五天| 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树
状态:看了视频题解和文章解析后做出来了。
2023-10-11 06:55:06 37
原创 代码随想录算法训练营第十三天| 104.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数
状态:看了视频题解和文章解析后做出来了。
2023-10-09 21:28:36 66 1
原创 代码随想录算法训练营第十二天| 102.二叉树的层序遍历 226. 翻转二叉树 101. 对称二叉树
状态:看了视频题解和文章解析后做出来了。
2023-10-07 05:46:53 112 1
原创 代码随想录算法训练营第十一天| 递归遍历 迭代遍历 统一迭代
二叉树的解题思路确定递归函数参数和返回值 确定终止条件 确定单层递归的逻辑前序中序后序的单层递归逻辑,遍历顺序与函数调用顺序保持一致。如前序遍历,节点遍历方式为中左右,则在单层递归中,首先把中的值加到结果列表中,然后调用函数传入左节点,最后调用函数传入右节点。解题思路:都注释在代码里了。代码与思路与144一致,只是把调用顺序换成了“左右中”。代码与思路与144,145一致,只是把调用顺序换成了“左中右”。思路:使用stack来维护需要处理的节点,先把当前节点的值加入结果,先入右节点再入
2023-10-06 07:42:00 137 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人