_porter
码龄5年
关注
提问 私信
  • 博客:14,634
    14,634
    总访问量
  • 54
    原创
  • 2,254,047
    排名
  • 3
    粉丝
  • 0
    铁粉
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:吉林省
  • 毕业院校: 吉林大学
  • 加入CSDN时间: 2019-08-21
博客简介:

DSZ___的博客

查看详细资料
个人成就
  • 获得56次点赞
  • 内容获得13次评论
  • 获得0次收藏
创作历程
  • 54篇
    2023年
成就勋章
兴趣领域 设置
  • 数据结构与算法
    排序算法推荐算法
  • 人工智能
    分类回归
创作活动更多

HarmonyOS开发者社区有奖征文来啦!

用文字记录下您与HarmonyOS的故事。参与活动,还有机会赢奖,快来加入我们吧!

0人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

代码随想录算法训练营总结 | LeetCode

单调栈,顾名思义,以单调递增或者单调递减的顺序将数组的元素存入栈内。背包问题:在动态规划基础上丰富了数组含义,依旧是靠动态规划五步曲解题,不过在这一部分笔者认为需要重点搞清楚内外for循环各遍历什么,且遍历顺序是怎样的(大部分情况是外层遍历物品,内层遍历背包容量,且容量要倒序遍历,防止一个物品被放入数组多次)。打家劫舍:这类问题dp数组的下表就不是代表容量了,而是代表最多处理到这个位置,前面的那些位置要怎样处理才能使结果最优要看题目的安排(让你要间隔一个处理啊等等)。遍历顺序和打家劫舍一样,也是顺序遍历。
原创
发布博客 2023.09.12 ·
444 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day60 | LeetCode 84. 柱状图中最大的矩形

思路:和昨天接雨水的题目类似。双指针做法就是记录每个节点左右两边最小的节点的下标(正好和接雨水相反);单调栈做法也是一样碰见大元素才入栈(和接雨水相反)。
原创
发布博客 2023.09.09 ·
306 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day59 | LeetCode 503. 下一个更大元素 II 42. 接雨水

思路:双指针做法:从两边往中间计算,先算出对于每个节点而言,以该节点为盆底的盆左右两边的高度。然后直接for循环遍历数组求出结果。单调栈做法:每次满足条件从栈中push出来元素时,尝试构建一个盆地,计算能够装多少水(初步理解如果没有挨在一起的元素相等的情况的话,宽度为1)。思路:和昨天的单调栈做法是一样的,用一个栈存放暂未获得结果的数组元素,只不过变成了循环数组,因此需要两次for循环遍历。
原创
发布博客 2023.09.08 ·
401 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day58 | LeetCode 739. 每日温度 496. 下一个更大元素 I

思路:新学习的单调栈做法,实质就是用一个栈存储中间结果。在针对数组某个元素的结果没找出来之前,将数组该元素的信息存入栈中,找到结果后,再从栈中删除该元素的信息。思路:和上题非常相似,只需在针对数组元素找到结果删除栈中该元素之际,判断该元素是否在另一数组中出现。因此本题需要用到unordered_map。
原创
发布博客 2023.09.07 ·
352 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day57 | LeetCode 647. 回文子串 516. 最长回文子序列

思路:难处在于定义dp[i][j]的表示,确定了dp[i][j]代表的含义就好办了,dp[i][j]代表以下标i开始、下标j结束的字符串是否是回文字符串。那么既然这样定义,该如何用到前面已经算好了的dp数组的值呢,答案是判断dp[i+1][j-1]是否是回文串(当j-i<=1时则不必),因此遍历循环外层是倒序,内层是顺序。不过dp数组的含义改变为:dp[i][j]代表以下标i开始、下标j结尾的字符串的最大回文子序列的长度。因此,初始化的时候要先令所有长度为1的字符串的dp数组的值为1。
原创
发布博客 2023.09.06 ·
276 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day56 | LeetCode 583. 两个字符串的删除操作 72. 编辑距离

思路:实际上就是求两个字符串的最长公共子序列。或者也可以换成编辑距离的理解思路(这种就是直接用动态规划解了,不用对结果做任何转换)。思路:dp最经典的编辑距离的题目了。直接按标准化流程走完。dp[i][j]含义:下标i-1结尾的字符串。和下标j-1结尾的字符串要变得相等最少要经过几次操作(删除,添加,替换)。
原创
发布博客 2023.09.05 ·
586 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day55 | LeetCode 392. 判断子序列 115. 不同的子序列

类似,可以看做是其一种特殊情况。两个元素不相等的时候也可以直接dp[i][j]=dp[i-1][j]。思路:第一次做,有点没太理解。
原创
发布博客 2023.09.04 ·
191 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day53 | LeetCode 1143. 最长公共子序列 1035. 不相交的线 53. 最大子数组和

思路:要注意如果不相等要dp[i][j] = max(dp[i-1][j], dp[i][j-1]),相等的话就直接dp[i][j] = dp[i-1][j-1]+1而不是取某些值中的最大值。思路:不能说毫不相同,只能说和上题一模一样。思路:和贪心的做法类似。
原创
发布博客 2023.09.02 ·
304 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day52 | LeetCode 300. 最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

依然是dp数组构造四部曲:1.确定dp数组的含义;3.确定dp数组初始化;直接拿nums[i]和nums[j]进行比较,如果nums[i]>nums[j]就取max(nums[i],nums[j]+1)。思路:两种做法,基础版二维dp数组,比较相等,类似于上题目的做法,碰到相等dp[i][j]=dp[i-1][j-1]+1。进阶版一维dp数组做滚动,内层for循环——对应背包容量循环,需要做倒序便利,并且不是每次取最大值,而是直接dp[j]=dp[j-1]+1,如果不相等,还要额外做赋0的操作。
原创
发布博客 2023.09.01 ·
271 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day51 | LeetCode 309. 买卖股票的最佳时机含冷冻期 714. 买卖股票的最佳时机含手续费

思路:增加了一个冷冻期,原本的二维数组dp的第二维的长度就要从2变为4,依次代表:0持有股票的状态、1从很早开始就不持有股票的状态、2今天刚把股票卖掉、3昨天刚把股票卖掉,今天为冷冻期。其实也可以将1状态和2状态合为一个状态,那么碰到今天本不持有股票状态(情况2带来的结果),想买入一只股票时,并不违法。(好像按照规定卖完一只股票后不能立马又买入一支股票,但是看运算结果我们就会发现对应+prices[i]-prices[i],说明通过这样来持有的股票,dp[i][0]=dp[i-1][0])。
原创
发布博客 2023.08.31 ·
236 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day50 | LeetCode 123. 买卖股票的最佳时机 III 188. 买卖股票的最佳时机 IV

思路:依旧是dp的股票类问题,题目说最多可以买卖两次,那么就定义一个二维的dp数组,第一维长度依然是数组长度,第二维长度为2*2=4,依次记录到某个节点时第一次持有股票、第一次不持有股票、第二次持有股票、第二次不持有股票的情况。思路:由二次买卖股票进阶到k次,那么处理结果也是一样的,就把二维dp数组的第二维的长度修改为2*
原创
发布博客 2023.08.30 ·
233 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day49 | LeetCode 121. 买卖股票的最佳时机 122. 买卖股票的最佳时机 II

思路:和上题类似,区别在于股票可以买卖多次,因此计算某个节点持有股票或者不持有股票时都要把本节点和以往结果做比较。例如对dp[i][0]进行赋值时,就要考虑是保持以往的持有数据好,还是在以往不持有股票的情况下购买此次的股票好。思路:定义一个二维dp数组,第二维长度为2,用来记录到每个节点时,持有股票或不持有股票情况下手里的现金。
原创
发布博客 2023.08.29 ·
237 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day48 | LeetCode 198. 打家劫舍 213. 打家劫舍 II 337. 打家劫舍 III

思路:dp题除背包外的另外一类题目,重点不在于看前面的情况,而在于考虑本节点的情况。另一种情况,不选择本节点,看哪种情况下的值最大。初始化也有所不同,不是简单地dp[0]=0,dp[1]=1诸如此类,dp[1]要考虑dp[0]的大小才能决定。思路:环形数组,第一次见dp中这样的设置,其实很简单,总体上考虑两种情况:情况一:考虑除数组头外的其他所有元素;思路:树形dp,dp的做法和二叉树的遍历的做法没有很大差异,或者说dp的做法就是基于二叉树的遍历做了一点点的改进,只是为了让它更像是动态规划。
原创
发布博客 2023.08.28 ·
525 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day46 | LeetCode 139. 单词拆分

思路:又是一种不同形式的背包问题,求一个字符串是否能由字符串数组中的若干字符排列组成。首相想到排列,所以要外层遍历背包容量for循环,内层遍历物品for循环。但是又不是简单的用dp数组解决排列组合的问题,而是求是/否的问题。因此dp数组初始化全false,遍历途中如果发现容量为j的背包可以由数组中的物品加上之前确定了的物品构成,那么dp[j]就赋值true。
原创
发布博客 2023.08.26 ·
587 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day45 | LeetCode 70. 爬楼梯 II 322. 零钱兑换 279. 完全平方数

思路:之前没有碰到过求最小值的完全背包问题,要注意进行最小值赋值时的条件判断。思路:和上题基本一样,只是为什么这里不用条件判断(这里挖个小坑)思路:用完全背包的方法做,比斐波那契数列的做法显得高大上一点。
原创
发布博客 2023.08.25 ·
271 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day44 | LeetCode 518. 零钱兑换 II 377. 组合总和 Ⅳ

今晚学习了完全背包的做法,和01背包的差别具体来说就是一个可以重复,一个不可以重复。体现在数组的遍历中来说就是完全背包不能用二维数组做法(因为二维dp数组一定不会重复,但是还没验证过),只能用一维dp数组,且背包容量for循环必须是顺序遍历,这样可以方便重复。碰到组合问题时,物品循环放外面,背包容量循环放里面;碰到排列问题时,背包容量循环放外面,物品循环放里面。(如果物品循环放外面,那么物品的顺序一定是固定了的,从前往后)思路:典型的完全背包组合题。思路:典型的完全背包排列题。
原创
发布博客 2023.08.24 ·
402 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day43 | LeetCode 1049. 最后一块石头的重量 II 494. 目标和 474. 一和零

所以还是用dp做,关键在于dp的构造,细想其实可以得到这个式子:left-right=targt, left+right=sum,可以推出left=(sum+target)/2,这就好办了,left即为我们的背包最大容量。(但此题与其他不同的是,他不是每次都去比较拿最大值,而是一直做加法,我的理解是实际还是做的排列组合)思路:把全部石头重量加起来,然后除以二,就等于背包的最大容量。然后就可以按照背包问题做,再将石头总质量减去背包最大容量得到的差减去背包里面的值,就是可以得到的最小结果。
原创
发布博客 2023.08.23 ·
550 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day42 | LeetCode 416. 分割等和子集

今天主要学习了一下01背包的二维数组和一维数组的做法,二维数组比较好理解,根据每次将不将物品i放入背包来充分的用到前面的数据遍历数组。二维数组遍历的时候,里层for循环是升序遍历的,而到了一维数组遍历的时候,里层for循环是降序遍历的(这主要是为了不让一个物品被重复放入背包)。思路:不看答案还真没有思路,最近几天的题目都体现着认知的差距,在知道题目解法的同时却很难给出实现方案,还是得多练。本题思路:背包容量为数组和的1/2,如果能够从数组中去除若干个数,使其和恰好为数组和的1/2,那么就满足条件。
原创
发布博客 2023.08.22 ·
505 阅读 ·
1 点赞 ·
1 评论 ·
0 收藏

代码随想录算法训练营day41 | LeetCode 343. 整数拆分 96. 不同的二叉搜索树

那么就好做文章了,节点多的二叉树一定是由节点少的二叉树构造而来,但是如何构造呢,在所有能插入节点的位置插上节点吗(计算原二叉树有多少个空节点?)实则不然,这样做太麻烦了。应当考虑根结点的左右子树,每次安排给他们不同的节点数量,这样实现就和上题类似了,一个一维数组dp,两层for循环。依旧和往常一下,建立dp数组,dp[n]的值一定取决于dp[n-1]的值,上次做到过二维的dp数组,这次虽然还是一维dp数组,但是完整的数组构建确是经过了两层for循环,相当于时间复杂度同为O(n^2)。
原创
发布博客 2023.08.21 ·
187 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

代码随想录算法训练营day39 | LeetCode 62. 不同路径 63. 不同路径 II

思路:遇到障碍dp[i][j]就赋值0,其他都是类似。比较容易漏掉的一点是,初始化的时候,也就是给dp数组第一行和第一列全部赋值1的时候要判断途中是否出现障碍物,若出现,后面的位置就都到不了,需要全部赋值为0.思路:整体思路是一样的,找到状态转移公式和初始化处理。不过这题开始dp数组变成了二维,需要着重考虑初始话特殊条件判断。
原创
发布博客 2023.08.19 ·
830 阅读 ·
2 点赞 ·
0 评论 ·
0 收藏
加载更多