Y_Vollerei
码龄3年
关注
提问 私信
  • 博客:32,645
    32,645
    总访问量
  • 53
    原创
  • 209,064
    排名
  • 462
    粉丝
  • 0
    铁粉
  • 学习成就
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:江苏省
  • 加入CSDN时间: 2021-06-06
博客简介:

Y_Vollerei的博客

查看详细资料
  • 原力等级
    成就
    当前等级
    4
    当前总分
    507
    当月
    1
个人成就
  • 获得584次点赞
  • 内容获得11次评论
  • 获得567次收藏
创作历程
  • 53篇
    2024年
成就勋章
创作活动更多

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

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

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

代码随想录算法训练营30期——总结篇

卡哥题目编排顺序设置的很好,刚开始刷题的时候正反馈拉满,就觉得自己怎么这么nb啊这都给我做出来了(然后被贪心和动规暴打),有段时间甚至做题手痒一天刷了四五道把第二天的题都刷掉了。我自认为自己的自制力不算差(应该能超过六七成的人吧),但我确实不敢说我能一个人在60天内从0开始完成这么多的算法题,甚至寒假还在刷,甚至刷完还都写了博客。
原创
发布博客 2024.03.17 ·
1103 阅读 ·
13 点赞 ·
0 评论 ·
8 收藏

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

寻找以heights[i]为高的最大矩形面积:找到左右两边第一个比自身矮的柱子作为界限,以该区间长度作为宽,heights[i]作为高得到矩形面积。这题其实和 42.接雨水有点相似,接雨水是寻找左右第一个比自身大的作为“墙壁”,这题是寻找左右第一个比自身小的作为“界限”训练营的最后一题啦,完结撒花!从栈顶到栈底递减的单调栈。
原创
发布博客 2024.03.15 ·
498 阅读 ·
9 点赞 ·
0 评论 ·
7 收藏

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

既然要找左右第一个比当前高的柱子,那么就很容易联想到单调栈。由于是找比自身大的,所以栈顶到栈底应该是递增的。知道怎么计算雨水量了,那么最朴素的思路就是只要知道每一个柱子左右边最高柱子的高度各是多少就能计算出该柱子能接的雨水量了。可以使用双指针判断每一个柱子的左右最高高度,但那样对于每个i都要遍历一次数组,时间复杂度为O(n2)。,使用两个数组分别记录当前位置左边与右边最高柱子的高度,时间复杂度为O(n)= min(左边最高柱子高度, 右边最高柱子高度) - 第i根柱子高度。(每个柱子占一格宽度)
原创
发布博客 2024.03.15 ·
519 阅读 ·
9 点赞 ·
0 评论 ·
9 收藏

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

将问题分解好这道题就不难了,两个子问题的处理都比较简单,其中单调栈的写法和上一题差不多。一般存放的是元素的下标,如果需要使用值可以通过下标获取。单调栈的作用:使用栈来记录已经遍历过的元素。什么时候使用单调栈:通常是一维数组,2、单调栈里的元素是递增还是递减的?本题求的是每个元素左边的第一个比自身。,此时我们就要想到可以用单调栈了。1、单调栈中存放的元素是什么?
原创
发布博客 2024.03.13 ·
542 阅读 ·
11 点赞 ·
0 评论 ·
8 收藏

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

s[j] 时:不取s[i]、不取s[j]、s[i]与s[j]都不取,三种情况中取最大(前两种情况包含了第三种情况,所以实际只有两种)情况3:j - i > 1,是否是回文串依赖[i + 1, j - 1]子串是否是回文串。: dp[i][j] 为bool,表示区间 [i, j] 内的最长回文子序列长度。: dp[i][j] 为bool,表示区间 [i, j] 的子串是否是回文串。:i 依赖 i + 1,j 依赖 j - 1,所以从下向上、从左向右遍历。情况2:i是j前一位,是回文串。
原创
发布博客 2024.03.11 ·
447 阅读 ·
7 点赞 ·
0 评论 ·
7 收藏

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

这类题目做多了还是能找到些套路的:1、DP数组定义· DP数组的定义一般是题目要求什么就定义成什么,· dp[i][j] 一般表示的是以word1[i - 1]为结尾的子串和 word2[j - 1]为结尾的子串2、DP数组初始化:结合题意,一般首行和首列的初始化最为重要3、递推公式分析状态转移可以分为“基础”和“新增”两部分:· 基础:继承之前的状态,如果当前值匹配一般只要进行这步操作· 新增:在之前状态的基础上增加操作时新增的值,如果当前值不匹配一般需要额外进行这步操作4、遍历顺序。
原创
发布博客 2024.03.10 ·
915 阅读 ·
23 点赞 ·
0 评论 ·
22 收藏

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

(实际为不使用s[i - 1],也不使用t[j - 1]时的匹配数,但由于s[i - 1] == t[j - 1],所以使用后当前匹配数与其相等,所以dp[i - 1][j - 1]可以理解为使用s[i - 1]时的匹配数)· 新增——dp[i - 1][j - 1]:如果s[i - 1]是否等于t[j - 1],则加上这个。,无论s[i - 1]是否等于t[j - 1],dp[i][j] 至少都会继承这个值。:首列元素初始化为1,s的所有子串都能与空字符串匹配一次。: dp[i][j] 表示以。
原创
发布博客 2024.03.08 ·
483 阅读 ·
8 点赞 ·
0 评论 ·
6 收藏

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

nums2[j - 1],dp[i][j] 取dp[i][j - 1] 和 dp[i - 1][j] 中的较大值。· 如果nums1[i - 1] == nums2[j - 1],那么dp[i][j] = dp[i - 1][j - 1] + 1(同718)1、之前的值加上nums[i]: dp[i] = nums[i] + dp[i - 1]左上方矩阵到达dp[i][j]的唯二途径就是dp[i][j - 1] 和 dp[i - 1][j]:dp[i]以nums[i]为最后一个元素的最大子数组和。
原创
发布博客 2024.03.07 ·
411 阅读 ·
7 点赞 ·
0 评论 ·
9 收藏

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

基本——dp[i - 1][j - 1]:以nums1[i - 2]和nums2[j - 1]为结尾的两个字符串的最长重复子数组长度。:如果nums1[i - 1] == nums2[j - 1],那么dp[i][j] = dp[i - 1][j - 1] + 1。· 最后的递推公式:dp[i]取较大值:dp[i] = std::max(dp[i], dp[j] + 1)这题的重点是DP数组的定义,子序列必须以nums[i]为最后一个元素,这样dp数组中后面的元素才能与前面的元素进行对比。
原创
发布博客 2024.03.06 ·
534 阅读 ·
8 点赞 ·
0 评论 ·
6 收藏

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

股票问题的动规解法还是有一定套路的,自己感觉做下来重点就是整理好状态分类和状态转移,前者决定DP数组的定义,后者决定递推公式状态分类状态分类的基础——持有不持有· 持有:今天或前几天完成了买入,当前手头持有股票· 不持有:今天或前几天完成了卖出,当前手头不持有股票在持有/不持有的基础上进一步结合题目分析状态分类,如:· 123.买卖股票III:持有/不持有进一步分为第一次或第二次的持有/不持有· 309.买卖股票含冷冻期:不持有进一步分为今日卖出和前几日卖出状态转移状态转移的基础——买入卖出。
原创
发布博客 2024.03.05 ·
904 阅读 ·
18 点赞 ·
0 评论 ·
18 收藏

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

dp[i][j]为当前利润,买入则减,卖出则加。j 取值范围[0, 4],分别表示第一次持有,第一次不持有,第二次持有,第二次不持有。思路与 121.买卖股票I 一脉相承,一次买卖有2种状态(持有/不持有),那么两次买卖就有4种状态(第一次持有/不持有、第二次持有/不持有):dp[0][0]初始化为-prices[0],其余元素都初始化为最小值,表示还没进行该操作。· 第 j 次持有的下标为 2 * j ,第 j 次不持有的下标为 2 * j + 1。· 第 j 次不持有需要在第 j 次持有的基础上进行。
原创
发布博客 2024.03.04 ·
449 阅读 ·
9 点赞 ·
0 评论 ·
8 收藏

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

dp[0]初始化为-prices[0],起步资金为0,所以相当于第一次买入,即 dp[0] = 0 - prices[0]· dp[i][1]表示如果当前不持有股票,所能获得的最大利润(· dp[i][0]表示如果当前持有股票,所能获得的最大利润(dp[i][j]为当前利润,买入则减,卖出则加。与 I 相比,差异在于可以反复买入卖出,即每次。时的启动资金不是0,而是之前卖出所得的资金总量。持有的股票可以是当天购入的也可以是之前购入的。可以是还没有购入过也可以是购入后卖出了。:按时间顺序从前向后遍历。
原创
发布博客 2024.03.03 ·
486 阅读 ·
10 点赞 ·
0 评论 ·
8 收藏

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

整体递推思路还是延续前两题:dp[i] = std::max(dp[i - 1], dp[i - 2] + nums[i])· 偷第i家:最大金额等于 i - 2 家的最大金额加上当前这家的金额(i - 1家被跳过),即dp[i - 2] + nums[i]· 递推公式选择金额高的一个:dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]):dp[0]初始化为nums[0],dp[1]初始化为max(nums[0], nums[1])(前两家选钱多的一家偷)。
原创
发布博客 2024.03.01 ·
412 阅读 ·
7 点赞 ·
0 评论 ·
9 收藏

代码随想录算法训练营Day46 | 139.单词拆分、多重背包(卡码网56.携带矿石资源)

一维滚动数组vector<bool>。dp[j]表示字符串s的[0, j]子串是否能够匹配。2、
原创
发布博客 2024.02.29 ·
450 阅读 ·
11 点赞 ·
0 评论 ·
9 收藏

代码随想录算法训练营Day45 | 70. 爬楼梯 (进阶)、322. 零钱兑换、279. 完全平方数

一维滚动数组。dp[j]表示凑成金额 j 最少需要几枚硬币。2、
原创
发布博客 2024.02.28 ·
394 阅读 ·
7 点赞 ·
0 评论 ·
11 收藏

代码随想录算法训练营Day44 | 完全背包理论基础、518.零钱兑换 II、377.组合总和 Ⅳ

无论是完全背包与0-1背包的差异,还是排列问题与组合问题的差异,最好的理解方法就是动手模拟一下dp数组的更新过程,模拟实际的物品是怎么一个个放入背包的。
原创
发布博客 2024.02.27 ·
507 阅读 ·
5 点赞 ·
0 评论 ·
9 收藏

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

对于要分为两组的问题,需要进行一定的数学推理将其变为一组,如:1049:将石头分为重量尽可能接近的两组 -> 分出一个子集,其总和尽可能接近总重量的一半494:将所有元素分为+的一组和-的一组,经过数学推理 -> 求统计总和为 (sum + target) / 2 的子集数量。
原创
发布博客 2024.02.26 ·
953 阅读 ·
15 点赞 ·
0 评论 ·
16 收藏

代码随想录算法训练营Day41 | 0-1背包理论基础、416.分割等和子集

一维数组,使用滚动数组来实现背包。方便理解使用二维数组来解释定义:dp[i][j]表示 n = i 时,数组下标[0, i]中取任意数所能得到的最大值,这个最大值不能超过j。
原创
发布博客 2024.02.25 ·
511 阅读 ·
8 点赞 ·
0 评论 ·
6 收藏

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

前几天的动规题感觉主要是“状态的转移”,考虑的是当前状态如何由之前的状态变化得到,如不同路径:当前节点由其上方或左方格子向下/右走得到爬楼梯:当前楼层由其前一层或两层跳跃得到这类问题的遍历维度和题目维度一致,爬楼梯是一维的那么就遍历一维,走格子是二维的那么就遍历二维的。而今天的题感觉主要是“拆”,考虑的是当前的状态如何拆分得到之前的状态,如整数拆分:一个数可以拆分为多个数使得其乘积最大不同的二叉树搜索树:一个树可以拆分为左右两个子树这类问题除了遍历题目中的维度,还得。
原创
发布博客 2024.02.23 ·
1665 阅读 ·
34 点赞 ·
0 评论 ·
29 收藏

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

有障碍时dp[i][j]设置为0(一方面表示没有方法能到达该格子,一方面表示无法从该格子出发向右或向下到达其他格子),否则dp[i][j] = dp[i - 1][j] + dp[i][j - 1]:走到一个格子即走到其上方格子再向下走一步,或走到其左方格子再向右走一步,所以:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]:二维DP数组,dp[i][j]表示到达行 i 列 j 格子的方法数。:首行与首列如果出现障碍物,其后的行/列都初始化为0,否则初始化为1。
原创
发布博客 2024.02.22 ·
1310 阅读 ·
14 点赞 ·
0 评论 ·
9 收藏
加载更多