- 博客(53)
- 收藏
- 关注
原创 代码随想录|总结篇
两个月前的决定刷题,但是一直没有什么动力,所以还是决定报刷题班,刷了没多久,没想到有工作需要去培训,培训时间也没时间刷,但是之前因为已经刷过一些,所以这次是补充,最后工作又没了。又回来开始刷题,当中有些题目还没弄懂,在结束之后重复一遍,还好还是有群可以问,先断断续续写这些吧。
2023-04-16 03:09:29
290
原创 代码随想录算法训练营第五十九天-单调栈2| 503.下一个更大元素II 42. 接雨水
成环就用取模mod方法接雨水这道题目是 面试中特别高频的一道题,也是单调栈 应用的题目,大家好好做做。建议是掌握 双指针 和单调栈,因为在面试中 写出单调栈可能 有点难度,但双指针思路更直接一些。在时间紧张的情况有,能写出双指针法也是不错的,然后可以和面试官在慢慢讨论如何优化。
2023-04-15 23:03:05
198
原创 代码随想录算法训练营第五十八天-单调栈1|739. 每日温度 496.下一个更大元素 I
因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。(再强调一下是指从栈头到栈底的顺序),因为只有递增的时候,栈里要加入一个元素i的时候,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i。即:如果求一个元素右边第一个更大元素,单调栈就是递增的,如果求一个元素右边第一个更小元素,单调栈就是递减的。单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。
2023-04-15 03:20:34
232
原创 代码随想录算法训练营第五十七天-动态规划17|647. 回文子串、516. 最长回文子序列。
dp[i][j]代表以i起始,j结尾的字符串的最长回文子序列的长度,如果i,j两个字符相等则,需要在其内部字符串的最长回文子序列长度的基础上加2,如果是j比i大1的情况,dp[i+1][j-1]为0,公式求出的正好为2,符合这种情况,如果两个字符不相等,则删除一个字符,就加一个字符,来看最长回文子序列的长度,选出大的一种情况赋值给dp[i][j]。dp[i][j]代表开始为i,结尾为j的字符串是否为回文串,如果遍历的i,j位置的两个字符相等,且i和j差为0或为1,则直接为回文串;输入:s = "abc"
2023-04-15 01:18:29
170
原创 代码随想录算法训练营第五十六天-动态规划16|● 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 编辑距离总结篇
解释: intention -> inention (删除 ‘t’) inention -> enention (将 ‘i’ 替换为 ‘e’) enention -> exention (将 ‘n’ 替换为 ‘x’) exention -> exection (将 ‘n’ 替换为 ‘c’) exection -> execution (插入 ‘u’)解释: horse -> rorse (将 ‘h’ 替换为 ‘r’) rorse -> rose (删除 ‘r’) rose -> ros (删除 ‘e’)
2023-04-14 00:13:48
776
原创 代码随想录算法训练营第五十五天-动态规划15|● 392.判断子序列 ● 115.不同的子序列
字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。示例 2: 输入:s = “axc”, t = “ahbgdc” 输出:false。给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。
2023-04-14 00:11:36
398
原创 代码随想录算法训练营第五十三天-动态规划14|1143.最长公共子序列 ,1035.不相交的线 , 53. 最大子序和
递推公式:dp[i][j] = dp[i - 1][j - 1] + 1,因为当前字符相同时,就是两者的前一个字符相同情况加1,(比如“abc”和“ac”,因为c == c, 所以就是“ab”和“a”的情况+1,不能是“abc”和“a”或者“ab”和“ac”加1,因为这时字符串的最后一个字符时不同的,不能满足当前字符相等的情况。但无法画出第三条不相交的直线,因为从 nums1[1]=4 到 nums2[2]=4 的直线将与从 nums1[2]=2 到 nums2[1]=2 的直线相交。
2023-04-14 00:08:11
580
原创 代码随想录算法训练营第五十二天-动态规划13|300.最长递增子序列 , 674. 最长连续递增序列 ,718. 最长重复子数组
连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l
2023-04-14 00:07:30
529
原创 代码随想录算法训练营第五十一天-动态规划12|309.最佳买卖股票时机含冷冻期 ,714.买卖股票的最佳时机含手续费
定义数组dp[i][j],表示第i天状态为j,所剩的最多现金为dp[i][j]。
2023-04-14 00:06:55
739
原创 代码随想录算法训练营第五十天-动态规划11|123.买卖股票的最佳时机III, 188.买卖股票的最佳时机IV
例如 dp[i][1] ,并不是说 第i天一定买入股票,有可能 第 i-1天 就买入了,那么 dp[i][1] 延续买入股票的这个状态。一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])那么dp[i][1]究竟选 dp[i-1][0] - prices[i],还是dp[i - 1][1]呢?
2023-04-14 00:06:05
346
原创 代码随想录算法训练营第四十九天-动态规划10|121. 买卖股票的最佳时机 , 122.买卖股票的最佳时机II
dp[i][1] = Math.max(dp[i - 1][1],price[i] + dp[i - 1][0])表示的是,今天是不持有股票,如果今天卖出股票的价格减去昨天持有股票的价格比昨天不持有股票的价格来的低,那么继续保持之前卖出股票的收益,如果今天卖出的价格比之前的高,那么就今天卖。这时候需要用二维数组进行定义,dp[i][0]表示第i天时,持有股票所花的最小钱,dp[i][1]表示第i天时,没有持有股票所得到的收益,没有持有股票说明是今天卖出,也有可能是之前卖出。同时,你不能在买入前卖出股票。
2023-04-14 00:04:59
515
原创 代码随想录算法训练营第四十八天-动态规划9|198. 打家劫舍,213. 打家劫舍 II,337. 打家劫舍 III
如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。如果不偷第i房间,那么dp[i] = dp[i - 1],即考 虑i-1房,(注意这里是考虑,并不是一定要偷i-1房,这是很多同学容易混淆的点)从dp[i]的定义上来讲,dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = max(
2023-04-14 00:04:02
1016
原创 代码随想录算法训练营第四十六天-动态规划8|139.单词拆分,(多重背包了解)
单词拆分这道题,我的思路是字符串看做背包容量,单词作为物品,字符串由单词组成,并且单词可以重复使用,因此可以看做是一道完全背包。(2)如果字符串切割[(i- 单词长度), i)(前闭后开)是单词数组中的一个单词,并且dp[i -单词长度 ]也是true,说明剩下的字符串也可以由其他单词组成。输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
2023-04-14 00:02:52
390
原创 代码随想录算法训练营第四十五天-动态规划7|70. 爬楼梯 (进阶), 322. 零钱兑换, 279.完全平方数
70爬楼梯这道题之前已经做过,是动态规划思想的入门,想要爬上第n层阶梯,看爬上n-1层的方法和n-2层的方法共有多少种,两个相加就是爬上n层阶梯的方法。初始化dp[0] = 0,因为0元的兑换不需要硬币,所以是0.因为零钱是可以重复使用的,所以是个完全背包问题,但是零钱是个组合问题,比如说6块钱可以用5元和1元零钱兑换,也可以用1元和5元兑换(和5元,1元的顺序不同),但是是同一种方法,所以这是组合问题。这里完全平方数可以重复使用,并且是个组合问题,和完全平方数的顺序无关,所以是个多重背包的组合问题。
2023-04-14 00:01:46
636
原创 代码随想录算法训练营第四十四天-动态规划6|518. 零钱兑换 II ,377. 组合总和 Ⅳ (遍历顺序决定是排列还是组合)
如果把遍历nums(物品)放在外循环,遍历target的作为内循环的话,举一个例子:计算dp[4]的时候,结果集只有 {1,3} 这样的集合,不会有{3,1}这样的集合,因为nums遍历放在外层,3只能出现在1后面!dp[0]=1还说明了一种情况:如果正好选了coins[i]后,也就是j-coins[i] == 0的情况表示这个硬币刚好能选,此时dp[0]为1表示只选coins[i]存在这样的一种选法。首先dp[0]一定要为1,dp[0] = 1是 递归公式的基础。而不会出现{5, 1}的情况。
2023-04-13 23:27:26
1413
原创 代码随想录算法训练营第四十三天-动态规划5|1049. 最后一块石头的重量 II , 494. 目标和 , 474.一和零
这里可以求集合的一个平均值,如果正好等于平均值,说明可以抵消,这时候重量为0,如果不行,就把这个平均值作为背包的容量,往这里面放东西,当放的重量最接近这个背包重量时,就是最优解。一和零,dp[i][j] 表示的是放入的最大子集的个数,i表示0的容量,j表示1的容量。解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4。输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3。
2023-04-13 23:24:24
1413
原创 代码随想录算法训练营第四十二天-动态规划4|● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集
因此就会产生一个状态转移方程,这个状态转移方程就是一种决策,如果背包容量不够,也就是物品太重,那么它产生的价值就是上次物品决策时的价值,也就是f(k - 1,w),同时剩余容量为w,也就背包的容量没有改变。这时可以看到,背包容量减少后,对应的一个小背包容量,面临的选择是剩下两个物品的决策。今天只有1道题,属于动态规划的01背包问题的应用。回到题目:分割等和子集,这个可以看成背包容量为整个集合的和的一半,只要背包正好装满,那么这个背包的价值就是整个集合的一半,背包的和与剩下的子集的和相等,可以返回true。
2023-04-13 23:21:31
1108
原创 代码随想录算法训练营第四十一天-动态规划3|343. 整数拆分 ,96.不同的二叉搜索树
这个思路可以简单理解为拆成两个数相乘【j * (i - j)】,拆成多个数相乘【j *dp[i - j]】 ,实际上dp[i - j] 就是由2个以上的数构成的,然后取j遍历过程中的最大的数就是最大值了。那么从1遍历j,比较(i - j) * j和dp[i - j] * j 取最大的。j的结束条件是 j < i - 1 ,其实 j < i 也是可以的,不过可以节省一步,例如让j = i - 1,的话,其实在 j = 1的时候,这一步就已经拆出来了,重复计算,所以 j < i - 1。
2023-04-13 23:18:54
1435
原创 代码随想录算法训练营第三十九天-动态规划2|62.不同路径 , 63. 不同路径 II
今天的路劲问题,思想和昨天的爬楼梯一样,主要还是找到你这个位置是怎么来的,到达dp[i][j]的方法由到达dp[i - 1][j]的方法再加上到达dp[i][j - 1]的方法和。63. 不同路径 II 加了一个障碍物进去,加障碍物进去后,其实就是多了一个条件,就是到达这个点的方法为0,所以在原来的基础上加上如果遇到障碍物,那么dp[i][j]就等于0,加上这个条件就可以了。输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]1. 向右 -> 向下 -> 向下。
2023-04-13 23:14:37
1533
原创 代码随想录算法训练营第三十八天-动态规划1|● 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯
关键点1:因为要得到F[n]:n是下标,所以初始化new int[n+1]:n+1是长度,输入:cost = [1,100,1,1,1,100,1,1,100,1]- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
2023-04-13 23:11:44
1135
原创 代码随想录算法训练营第三十七天-贪心算法6| 738.单调递增的数字 968.监控二叉树 总结
题目要求小于等于N的最大单调递增的整数,那么拿一个两位的数字来举例。例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。这一点如果想清楚了,这道题就好办了。此时是从前向后遍历还是从后向前遍历呢?从前向后遍历的话,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一
2023-04-13 23:04:46
1176
原创 代码随想录算法训练营第三十六天-贪心算法5| 435. 无重叠区间、763.划分字母区间、56. 合并区间
就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,如果这个最小值也触达到区间3,那么说明 区间 1,2,3都是重合的。所以一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。这几道题都是判断区间重叠,区别就是判断区间重叠后的逻辑,本题是判断区间重贴后要进行区间合并。区间4结束之后,再找到区间6,所以一共记录非交叉区间的个数是三个。区间,1,2,3,4,5,6都按照右边界排好序。
2023-04-13 23:02:03
543
原创 代码随想录算法训练营第三十五天-贪心算法4| ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球
但仔细思考一下就发现:如果把气球排序之后,从前到后遍历气球,被射过的气球仅仅跳过就行了,没有必要让气球数组remove气球,只要记录一下箭的数量就可以了。直觉上来看,貌似只射重叠最多的气球,用的弓箭一定最少,那么有没有当前重叠了三个气球,我射两个,留下一个和后面的一起射这样弓箭用的更少的情况呢?如果真实的模拟射气球的过程,应该射一个,气球数组就remove一个元素,这样最直观,毕竟气球被射了。此时大家就发现 情况一,情况二,都是固定策略,都不用我们来做分析了,而唯一不确定的其实在情况三。
2023-04-13 22:59:51
1184
原创 代码随想录算法训练营第三十四天-贪心算法3| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
的思路,局部最优:让绝对值大的负数变为正数,当前数值达到最大,整体最优:整个数组和达到最大。局部最优可以推出全局最优。那么如果将负数都转变为正数了,K依然大于0,此时的问题是一个有序正整数序列,如何转变K次正负,让 数组和 达到最大。那么又是一个贪心:局部最优:只找数值最小的正整数进行反转,当前数值和可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了),全局最优:整个 数组和 达到最大。
2023-04-13 22:55:00
1413
原创 代码随想录算法训练营第二十三天-二叉树9 |669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
二叉树9
2022-11-25 08:28:17
115
原创 代码随想录算法训练营第二十二天- 二叉树8|二叉搜索树--- 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
二叉搜索树
2022-11-21 18:07:58
164
原创 代码随想录算法训练营第二十一天- 二叉树7| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
二叉树7
2022-11-21 15:43:20
195
原创 代码随想录算法训练营第十八天-二叉树5|513. 找树左下角的值,1112. 路径总和,113. 路径总和ii,106.中序与后序构造二叉树,105.中序与前序构造二叉树,654.
二叉树5
2022-11-14 12:29:55
115
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人