- 博客(56)
- 收藏
- 关注
原创 Day63 单调栈part02
LC42接雨水(未掌握)暴力解法:按列求雨水体积宽度一定是1高度,取决于,该列 左侧最高的柱子和右侧最高的柱子中最矮的那个柱子的高度。代码双指针优化法:每到一个柱子都向两边遍历一遍,这其实是有重复计算的。我们把每一个位置的左边最高高度记录在一个数组上(maxLeft),右边最高高度记录在一个数组上(maxRight),这样就避免了重复计算代码单调栈需要寻找一个元素,右边最大元素以及左边最大元素,来计算雨水面积单调栈从栈头到栈底的顺序是从小到大的一旦发现添加
2024-07-11 23:34:55
850
1
原创 Day62 单调栈part01
LC739每日温度(未掌握)暴力解法:两层for循环,时间复杂度O(n^2),会超时未掌握原因分析:只想到了从栈顶到栈底是递减的情况,忽略了从栈顶到栈底是递增的情况因为需要找到一个元素右边第一个更大元素,只有递增的时候,栈里要加入一个元素i的时候,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i下标i和栈顶元素下标是我们已知的信息,我们需要的也是下标,只有充分利用我们已知的信息才能减轻负担代码LC496下一个更大元素I(未掌握)本质是跟LC739一样的,但是因为涉及两个数
2024-07-09 23:13:57
459
原创 Day59 动态规划part12
LC115不同的子序列(未掌握)递推公式与LC392类似,但是初始化略有不同LC392的dp数组含义为相同字符个数而本体的dp数组含义为出现的次数,因此dp[i][0]=1两种情况s[i-1]==t[j-1]dp[i][j] = dp[i-1][j-1]dp[i][j] = dp[i-1][j]s[i-1]!=t[j-1]=》dp[i][j] = dp[i-1][j]代码LC583两个字符串的删除操作其实本质就是求最长公共子序列,跟LC1143一样代码
2024-07-07 22:29:31
519
原创 优化后Day53 动态规划part11
1.dp数组的含义:dp[i][j]表示以下标i结尾的text1子序列和以下标j结尾的text2子序列的最长公共子序列2. 初始化:跟LC718一样,i结尾的需要初始化,i-1结尾不需要初始化3. 递推公式。
2024-07-07 18:15:11
254
原创 优化:Day52 动态规划part10
LC300最长递增子序列dp数组中dp[i]的含义是:以nums[i]结尾的子序列中最长递增子序列的长度为dp[i]最长连续递增子序列非连续最长递增子序列如果是连续的,只需要nums[i]>nums[i-1]就将dp值+1,但是如果是非连续的,nums[i]之前的所有子序列都可能跟nums[i]组成递增子序列,因此需要多加一层循环LC674最长连续递增子序列LC718最长重复子数组(未掌握)未掌握分析:想复杂了dp数组的含义:dp[i][j]表示nums1中以nums1[i
2024-06-17 23:44:47
290
原创 Day53 动态规划part12
LC309买卖股票的最佳时机含冷冻期与LC122类似,都是可无限次购买股票,只不过引入了冷冻期的概念dp[i][0] 第i天持有股票收益;dp[i][1] 第i天不持有股票收益;情况一:第i天是冷静期,不能以dp[i-1][1]购买股票,所以以dp[i - 2][1]买股票,没问题情况二:第i天不是冷静期,理论上应该以dp[i-1][1]购买股票,但是第i天不是冷静期说明,第i-1天没有卖出股票,则dp[i-1][1]=dp[i-2][1],所以可以用dp[i-2][1]买股票,没问题代码
2024-06-08 19:22:40
438
原创 Day49 动态规划part08
LC139单词拆分(未掌握)未掌握分析:将字符串s中的各个字符看成是背包,思考成了多重背包问题单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。拆分时可以重复使用字典中的单词,说明就是一个完全背包!只不过与一般的完全背包不同的是需要考虑物品的顺序问题,物品并不能随意摆放在背包中dp数组的含义:dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词确定递推公式:如果确定dp[j] 是true,且 [j, i] 这个区间的子
2024-06-07 23:02:59
380
原创 Day46 动态规划part06
完全背包问题完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。先遍历物品还是先遍历背包以及遍历顺序根据递推公式可知:每一个dp需要根据上方和左方的数据推出,只要保证数据左上方数据是递推出来的这种两个for循环的顺序就是可以的01背包:01背包二维dp数组:两个for遍历的先后循序是可以颠倒行是背包容量,列是物品,从小到大遍历物品和背包先物品再背包:一行一行进行遍历,左上元素是递推出来的(有一行是初始化)先背包再物品:一列一列进行遍历,左上元素是递推出来的01背包一维d
2024-06-02 14:06:12
319
原创 Day45 动态规划part05
LC1049最后一块石头重量II(未掌握)未掌握分析:其实本题跟LC416分割等和子集类似,本质上题目的要求是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,也就是01背包问题weight和value都是stones数组,题目可以看成是target=sum/2,即求背包容量是target所装石头的value是多少。target = sum / 2 因为是向下取整,所以sum - dp[target] 一定是大于等于dp[target]的。代码LC494目标和(未掌握)未能够将题意转
2024-06-01 22:15:02
512
原创 动态规划part02 Day42
LC62不同路径LC63不同路径II(超时10min)超时原因分析:思路想错了,即便是正确思路初始化也有点问题,应该将不必要的判断逻辑引入初始化的过程中初始化:从左上角到[i][0]和[0][j]都只有一条路径dp[i][0]=1和dp[0][j]=1引入故障,因此还需要obstacleGrid[i][0]==0和obstacleGrid[0][j]==0循环过程中,如果存在左边或者上边有故障,那么他们的dp值一定是0的,因为判断obstacles[i][j]==1直接continue
2024-05-28 18:00:00
328
原创 动态规划part01 Day41
动态规划算法解题步骤确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组LC509斐波那契数LC70爬楼梯LC746使用最小花费爬楼梯dp[]含义:爬到第i层楼梯的最小花费
2024-05-28 16:57:18
300
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人