- 博客(56)
- 收藏
- 关注
原创 Day63 单调栈part02
LC42接雨水(未掌握)暴力解法:按列求雨水体积宽度一定是1高度,取决于,该列 左侧最高的柱子和右侧最高的柱子中最矮的那个柱子的高度。代码双指针优化法:每到一个柱子都向两边遍历一遍,这其实是有重复计算的。我们把每一个位置的左边最高高度记录在一个数组上(maxLeft),右边最高高度记录在一个数组上(maxRight),这样就避免了重复计算代码单调栈需要寻找一个元素,右边最大元素以及左边最大元素,来计算雨水面积单调栈从栈头到栈底的顺序是从小到大的一旦发现添加
2024-07-11 23:34:55 801
原创 Day62 单调栈part01
LC739每日温度(未掌握)暴力解法:两层for循环,时间复杂度O(n^2),会超时未掌握原因分析:只想到了从栈顶到栈底是递减的情况,忽略了从栈顶到栈底是递增的情况因为需要找到一个元素右边第一个更大元素,只有递增的时候,栈里要加入一个元素i的时候,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i下标i和栈顶元素下标是我们已知的信息,我们需要的也是下标,只有充分利用我们已知的信息才能减轻负担代码LC496下一个更大元素I(未掌握)本质是跟LC739一样的,但是因为涉及两个数
2024-07-09 23:13:57 415
原创 Day60 动态规划part13
LC647回文子串(未掌握)暴力:两层for循环,遍历区间起始位置和终止位置,然后还需要一层遍历判断这个区间是不是回文。所以时间复杂度:O(n^3)dp数组含义常规dp数组:题目求什么,我们就如何定义dp数组。但是此题这样定义很难找到对应的递归关系根据回文性质来定义dp数组:判断一个子字符串(字符串的下表范围[i,j])是否回文,依赖于,子字符串(下表范围[i + 1, j - 1])) 是否是回文dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串递
2024-07-08 23:48:59 309
原创 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 483
原创 优化后Day53 动态规划part11
1.dp数组的含义:dp[i][j]表示以下标i结尾的text1子序列和以下标j结尾的text2子序列的最长公共子序列2. 初始化:跟LC718一样,i结尾的需要初始化,i-1结尾不需要初始化3. 递推公式。
2024-07-07 18:15:11 229
原创 优化: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 268
原创 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 414
原创 Day49 动态规划part08
LC139单词拆分(未掌握)未掌握分析:将字符串s中的各个字符看成是背包,思考成了多重背包问题单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。拆分时可以重复使用字典中的单词,说明就是一个完全背包!只不过与一般的完全背包不同的是需要考虑物品的顺序问题,物品并不能随意摆放在背包中dp数组的含义:dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词确定递推公式:如果确定dp[j] 是true,且 [j, i] 这个区间的子
2024-06-07 23:02:59 351
原创 Day48 动态规划part07
爬楼梯进阶版(未掌握)没有搞清楚完全背包的排列和组合的区别题目问的是有多少组不同的方法爬上楼顶,{2,1}和{1,2}是不同的方法,因此属于排列问题,所以应该先背包后物品根据题意可知,将需要n阶爬上楼顶理解为背包容量最大为n,每次你可以爬至多m 个台阶理解为一共有m个物品,每个物品的重量是m,且每个物品没有使用次数限制。题目变成完全背包问题,即装满容量为n的背包一共有多少种方法代码:LC322零钱兑换本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。所以本题并不强
2024-06-06 23:15:34 307
原创 Day46 动态规划part06
完全背包问题完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。先遍历物品还是先遍历背包以及遍历顺序根据递推公式可知:每一个dp需要根据上方和左方的数据推出,只要保证数据左上方数据是递推出来的这种两个for循环的顺序就是可以的01背包:01背包二维dp数组:两个for遍历的先后循序是可以颠倒行是背包容量,列是物品,从小到大遍历物品和背包先物品再背包:一行一行进行遍历,左上元素是递推出来的(有一行是初始化)先背包再物品:一列一列进行遍历,左上元素是递推出来的01背包一维d
2024-06-02 14:06:12 289
原创 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 487
原创 动态规划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 287
原创 动态规划part01 Day41
动态规划算法解题步骤确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组LC509斐波那契数LC70爬楼梯LC746使用最小花费爬楼梯dp[]含义:爬到第i层楼梯的最小花费
2024-05-28 16:57:18 270
原创 Day39贪心算法part06
LC738单调递增的数字(未掌握)思路分析:一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9字符串是不可变的,不可以使用s.charAt(i)='9’来改变字符串某个位置的值String[]数组转换为String不可以直接使用String.valueOf(),会将数组的地址转换成String其他类型转换为字符串可以使用+“”。 String[]数组转换为String使用String.join(
2024-05-25 23:27:29 294
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人