自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 收藏
  • 关注

原创 代码随想录 第十章 单调栈part02 42. 接雨水 84.柱状图中最大的矩形

接雨水的解题关键在于要找到坑的左右边界,左右边界一定比坑底高,所以要点就在于寻找一个位置的左右的更高点,所以构造的单调栈就应该是单调下降的,在遇到比栈顶更大的数据时就弹出栈顶数据,新的栈顶因为堆栈单调下降的特性,一定比刚弹出的要大,以两侧的更小值减去坑底大小再乘上距离就能得到填上这个小坑所需要的水,直到栈顶元素大于新的元素,就代表这个局部的坑已经填上了,值得说明的是,遇到相等大小的元素也需要直接入栈,以免在计算中的距离比实际的大。

2024-09-29 16:08:23 201

原创 代码随想录 第十章 单调栈part01 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II

这题笔者想了很久,最后发现自己题都没看懂,这题给的两个序列,nums1是nums2的子集,要求的是nums1中的元素在nums2中同元素右侧的第一个更大的元素,所以在这题中,首先将nums1的元素与下标变为一个unordered_map,在nums2中做与上一题类似的事,即构建一个单调递减的堆栈,不过这次触发记录的条件不再是单纯的元素大小,还有元素在map中是否存在,以及记录的不是距离而是元素本身。弹出所有小于新元素的元素后,将新的元素压入堆栈。

2024-09-28 10:21:38 200

原创 代码随想录 第九章 动态规划part13 647. 回文子串 516.最长回文子序列

实际上笔者的理解,i和j就是一种双指针,分三种情况,一种是i和j指向同一字符,只有一个字符是最短的回文,第二种是两字符相邻,两个相邻的字符相同也符合回文,这两种就可以不需要考虑其它字符,第三种就是两字符虽然相同但不相邻,那么就需要判断两字符中间的部分是否满足回文,如果满足,那么就是新的一串回文。其实就是把字符串翻转过来,和原字符串比对最长公共子序列。

2024-09-27 15:34:30 160

原创 代码随想录 第九章 动态规划part12 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离

因为只用到前一行的第i和第i-1位置的数据,所以简化一下就可以用一维的dp数组实现。与上一题随想录给的思路差不多,但因为可以修改字符,所以在字符不匹配的情况下增加了从左上位置计算的部分,在是两字符串相同的过程中,增加和删除的步数是一样的,所以可以只考虑删除与替换,一次替换可以实现一位的相同,而用删除需要两次,所以把左上的数据也引入,因为左上位置的数据就是在字符串各删一个字符时的最小处理次数,在各加一位且新的一位不同时,一次替换即可。

2024-09-26 16:25:22 239

原创 代码随想录 第九章 动态规划part11 1035.不相交的线 53. 最大子序和 392.判断子序列

这题在贪心算法的部分写过,在动态规划的写法其实大差不差,都是利用的同一个规律。如果有一个连续的序列和最大,那么序列中以边缘为起点或终点的任意子序列和就不可能为负,否则去掉这部分子序列的序列和会更大。线不共用起点与终点,不能相交,那么实际上就与求两个序列中顺序不变的最长子序列是一样的,所以还是用求取最长子序列的方式计算。这题与不相交的线相同,只是要在最终得到最长子序列长度后需要做一些判断来得出s是否是t的子序列。

2024-09-25 19:19:14 198

原创 代码随想录 第九章 动态规划part11 1143.最长公共子序列

这题的思路在于dp[j][i]中所存的是text1前i个字符与text2前j个字符的最长子字符串,在不断遍历中如果碰到了相同的字符,那么就取dp[j-1][i-1]+1,也就是两字符串各减一位时的最长子字符串长度+1,如果不同,就取dp[j-1][i]与dp[j][i-1]中的最大值,因为当前两个字符不同,所以两者的最大值也就是当前位置的最长子字符串长度。

2024-09-21 11:04:25 211

原创 代码随想录 第九章 动态规划part10 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

这题按照随想录的解法还是比较好理解的,根据两个数组的尺寸构建相应大小的二维数组,就可以用来表示两个数组中元素的对应关系,根据两个元素的索引,可以找到在二维数组中对应的位置,并根据两个元素是否相等,在二维数组中对应的位置填入相应的结果。这题的思想就是在dp数组中存储以当前元素为结尾的最长递增数组的长度,在访问新的元素时,遍历已经计算过的元素,寻找小于当前元素的数据,在所有匹配的元素中,选择对应dp最大的元素的长度+1。这题就比较简单,只要看前一位数字是否小于当前数字即可。

2024-09-20 14:22:31 241

原创 代码随想录 第九章 动态规划part09 188.买卖股票的最佳时机IV 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

冷冻期在卖出后对下次交易时间有要求,实际上只需要将迭代中中纳入计算的数据部分前推即可。就是之前两次交易的扩展,吧dp数组扩大,以同样的迭代方式计算即可。只要在买入的计算中把手续费算进去就行。

2024-09-19 15:15:46 149

原创 代码随想录 第九章 动态规划part08 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II 123.买卖股票的最佳时机III

笔者列了两个代码,随想录提过,后面那种写法看起来很简单但是有点蹊跷,就是从左向右进行计算,但之后的计算又要用到前面的数据,也就意味着后面对买入卖出的计算混入了当天的数据而非前一天,随想录从当天买入卖出等于不变的角度解释了,笔者再加一条,先计算的是当天买入的情况,如果买入发生变化,也就意味着当天的股票价格相较于前一天是下降的,所以当天不可能会卖出,所以卖出状态只会保持不变,而同一天买入卖出就是保持不变,所以即便混入了当天的数据也能得出正确结果。不过实际上从右向左计算也是对的,并且在逻辑上更加清晰。

2024-09-18 11:04:25 317

原创 代码随想录 第九章 动态规划part07 198.打家劫舍 213.打家劫舍II 337.打家劫舍III

随想录给的题解是自底向上,求取对当前节点来说,打劫与不打劫的最大值,在递归中,每个节点会向上传递两个值,一个是打劫当前节点的最大值,一个是不打劫当前节点的最大值,前者意味着不能打劫左右子节点,所以直接利用子节点得出的不打劫子节点的最大值计算,后者代表子节点可以被打劫也可以不被打劫,比对子节点得出的被打劫与不被打劫的最大值计算即可,一次类推,即可得到答案。这题一开始笔者以为或许会给出一种只需遍历一遍即可的方案,看了题解之后发现就是一次掐头一次去尾,遍历两次取最大值。

2024-09-17 11:08:10 225

原创 代码随想录 第九章 动态规划part06 322. 零钱兑换 279.完全平方数 139.单词拆分 多重背包

这题与背包看起来不挨着,但是看懂了随想录所给的思路后并不难。这题的不一样之处在于求的不是最大值,而是最少要几个硬币,所以对于dp数组的初始化做赋最大值处理。这题与上一题同理,只是硬币不是所给的,而是由索引求取。

2024-09-16 15:00:02 179

原创 代码随想录 第九章 动态规划 part05 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ 70. 爬楼梯

因为完全背包中的物品没有出现次数的限制,可以重复,所以也就不需要像之前的背包一样外层遍历物品内层从右向左遍历背包,可以倒转内外层遍历。这题看起来与零钱兑换很像,但差别在于这题所求的是排列而不是单纯的组合,需要将不同元素的出现顺序也纳入计算,这就需要在外层遍历背包容量,内层遍历元素,元素是以各自的出现加入计算,而不是以出现的数量加入计算。这题的关键在于所求的是硬币的组合,所以需要先遍历硬币种类,再遍历背包容量,将一种硬币所有出现的可能在一轮迭代中加入dp数组,就不会将硬币的出现顺序也纳入计算。

2024-09-15 10:30:26 251

原创 代码随想录 第九章 动态规划part04 494. 目标和 474.一和零

这题是背包问题的一个变种,求取的不是背包的最大重量,而是装下一个重量的方案数,与之前的背包问题的区别在于,动态规划数组中的数据代表的不是最大重量而是方案数,因此迭代时,采取的不是取最大而是求和,迭代方向则是一样的。这题的背包多一个维度,就是在有两种限制条件的背包中装下最多数量的物品,迭代的思路是一样的。

2024-09-14 10:52:36 168

原创 代码随想录 第九章 动态规划part04 1049. 最后一块石头的重量 II

这题其实与之前的将数组分割为两个和一样的部分是一样的,将石头分割为两个重量尽可能接近的部分,两部分之和就是所求的答案,所以问题也就可以转化为石头总重/2大小的背包问题。在使用一维背包中有一个注意点,就是背包的更新要从右向左,因为动态规划需要的信息与上一轮迭代的的结果中背包容量较小的部分有关,如果从左至右迭代,就会导致之后迭代所需的信息出现错误。

2024-09-13 19:16:43 235

原创 代码随想录 第九章 动态规划part03 01背包问题 一维 416. 分割等和子集

这题乍一看首先想到的思路就是回溯,不过现在是动态规划了。如果将数字集合看做重量与价值相等的物品集合,如果集合能分为两个和相等的子集,在背包问题中也就意味着在背包最大容量为所有物品重量和的1/2时,最多能装下重量为所有物品和的1/2的物品,因为物品价值与重量相等,所以最优价值不会大于背包容量,但如果最终最优价值低于背包容量,也就代表数字集合无法被分为两个和相等的部分。

2024-09-12 10:19:57 564

原创 代码随想录 第九章 动态规划part03 01背包问题 二维

这题动态规划数组的计算方式会有一些难以理解,不过如果按照随想录所给的思路在纸上推导一次就会清晰很多。在计算一个位置的值时又两种可能,一时当前剩余空间放的下,一种就是放不下,在保证动态规划数组计算过的值为最大价值时,在放不下的情况下,最大值就是用空间下上一行的值,而放的下的情况意味着需要去能给出那么多空间余量的方案中找,而在数组中,如果当前物品占空间为k,那么上一行的少k列位置的方案一定能给出k的余量,那么动态规划数组的计算过程也就明确了。

2024-09-11 17:27:34 622

原创 代码随想录 第九章 动态规划part02 62.不同路径 63.不同路径 II 343.整数拆分 96.不同的二叉搜索树

这题笔者觉得很妙,一个包含n个节点的二叉搜索树左侧与右侧子树各自的节点数都小于n,代表在动态规划的过程中这是已经求过的已知数,左侧与右侧节点数各自固定的情况下,由于搜索树的性质,根节点是唯一的,所以通过遍历所有两侧节点个数各自的搜索树可能性,相乘求和,就能得到答案。这题的区别在于有障碍物,这就需要在求和的基础上增加对障碍物的处理,需要根据左侧与上侧是否有相邻障碍物判断如何计算。一个格子的路径可能性种类就是上侧与左侧格字路径可能性的和。

2024-09-04 17:06:04 330

原创 代码随想录 第九章 动态规划part01 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

每格的计算就是取前两格的最低开销与离开楼梯的开销和的最小值,从最低开始计算,就可得到到每一格楼梯的最小开销,最终得到走完楼梯的最小开销。只要把斐波那契数列的第一个数改为1即可,因为走1或2都可以就代表当前楼梯的方法数就是前两格楼梯方法数之和。没什么好说的,很简单。

2024-09-03 10:23:32 174

原创 代码随想录 第八章 贪心算法 part05 56. 合并区间 738.单调递增的数字 968.监控二叉树

对这题稍加观察就会发现,如果所给的数字不满足单调递增,则答案的数字尾必然是一串9,因为一串9是最大的,所以对数字从后往前判断是否满足单调递增,不满足的地方将前一位-1,保证后面全为9时也小于原数字,即可得到答案。这题随想录给的思路是使用3个数字标记节点的三种状态,采用后序遍历,先从叶子节点开始判断是否加监控,只需要理清一个节点在子节点具有什么状态时需要加监控即可。这题与之前的射气球等类似,对左边界进行排序后对是否重叠进行判断,对重叠的元素进行合并即可。

2024-09-01 14:07:58 245

原创 代码随想录 第八章 贪心算法 part04 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.划分字母区间

这题同样巧妙,根据右边界进行升序排序,让可能重叠的区间尽可能再索引上相邻,这样只需要关注左边界就能确定是否重叠,且由于右边界递增,最早访问的区间可能发生重叠的可能性越小,因为判断受否重叠是比对右边界与最新访问到的左边界,右边界越小,重叠的可能性也越小,需要去除的可能性也越小。先遍历一遍字符串,记录字母右边界,在确认区间集合范围时,已经出现过的字母中最大的右边界就是当前区间集合可能的最小右边界,当遍历完最大字母右边界内所有字母而最最大右边界没有更新时,就说明找到了区间集合的右边界。

2024-08-31 11:09:14 187

原创 代码随想录 第八章 贪心算法 part03 134. 加油站 135. 分发糖果 860.柠檬水找零 406.根据身高重建队列

这题的解决方案很巧妙,在对身高进行降序排列,对编号进行升序排列后,从容器起始开始遍历,编号就是这一元素要插入到result中的索引,因为插入到result的身高比还没插入的都高。兼顾两侧存在困难,因为一个小朋友的糖既与左侧有关又与右侧有关,即一个小朋友手里的糖与所有小朋友的评分都相关,所以不能以一次遍历同时兼顾,所以以两轮遍历分别对左右两侧进行比对。随想录给的实现很简单,找到包含序列尾的尽可能长的和不为负的子序列的起始。

2024-08-30 13:24:57 230

原创 代码随想录 第八章 贪心算法 part02 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II 1005.K次取反后最大化的数组和

这题笔者一下子没想到,只想到暴力求解,看了眼随想录的思路,看到范围俩字就悟了,从一个位置开始由最大跳数就可以求的在一个位置下一步最远能到哪的范围,对最大范围内的元素遍历,找到更大的最大范围,直到遍历完序列中的所有元素,或超过最大范围,如果是因为超出最大范围结束,表明无法跳到序列尾。这题笔者从上一题的思路开始延伸,这题在保证序列可达序列尾的条件下求取最小跳数。所以用step承担记录范围与最小跳数的功能。这题实际上就是求增量,指对序列中有增量的相邻元素做计算,下降的部分不做处理。是一种开天眼式的炒股计算)

2024-08-20 11:34:14 139

原创 代码随想录 第八章 贪心算法 part01 455.分发饼干 376. 摆动序列 53. 最大子序和

从求和为负的序列整体而言,这部分为负,那么这段序列就不可能出现在最大和序列的边缘,从求和的过程分析,当一段序列前段求和为正,直到最后一位求和为负时,说明能对序列和起正向作用的部分在序列前部,后部起负面作用,且负面作用大于正面作用。尺寸为3的饼干能满足胃口为3、2、1的小朋友,而尺寸为1的饼干只能满足胃口为1的小朋友,所以要满足尽量多的小朋友需要让所选的小朋友的胃口值尽可能接近饼干的尺寸。因为是笔者脑估的性质,所以笔者的代码比较多余,随想录有更加严谨的说明与简洁的代码。

2024-08-19 14:44:59 222

原创 代码随想录 第七章 回溯算法 part04 37.解数独

这题笔者一开始设想的回溯函数需要的参数包括当前数独数组与要进行回溯的元素坐标,但是在编写过程中发现,这样写对于如何回溯与合适结束回溯需要比较复杂的判断,所以在这里还是使用了随想录所给的思路,即不传递下一格需要回溯的元素位置,而是由回溯函数自行寻找仍然没填上数字的位置,这样虽然会增加一定的时长,但是对于何时结束回溯的判断逻辑比较简明。

2024-08-16 16:33:46 221

原创 代码随想录 第七章 回溯算法 part04 51.N皇后

说起来其实不难,只要能正确判断一个位置是否能放皇后就能解决,笔者一开始没看清输出要求,以为是棋盘是拉直后整个输出,所以用一维容器来表示棋盘,用二维容器表示棋盘时判断是否能放皇后会更加容易。由于N皇后的性质,棋盘一行必须有且仅有一个皇后,所以回溯可按行分层,省去了在在判断是否能放皇后时对行进行检查的步骤。

2024-08-13 15:15:31 222

原创 代码随想录 第七章 回溯算法 part04 332.重新安排行程

随想录的解法通过建立unordered_map,将从一个机场到其他机场的可能性都包含在unordered_map下的map,这样在回溯过程中不需要遍历tickets寻找合适的票,并且map基于黑红树实现,能够自动实现排序,因此通过map存储机场到其他机场的余票,遍历过程中天然就可以排除所有字典排序不是最小的路线,找到的第一条可行路线就是最小的。笔者也尝试将删除路线的部分用于在回溯过程中剪枝,但依然超时,所以去看了随想录的解法,然后照着随想录的思路写。

2024-08-12 14:31:15 344

原创 代码随想录 第七章 回溯算法 part04 简单部分 491.递增子序列 46.全排列47.全排列 II

这题与此前的求组合也不同,在于这题要得到子序列,所以不能通过排序的手段去重,所以就再每层回溯中增加一个哈希表,记录曾经作为过起点的元素,再之后的循环中遇到哈希表中存在的匀速就跳过本轮循环,直接进入下一轮。可以这样去重的原理在于,访问到的哈希表中不存在的元素,是相同元素中索引最小的,意味着这一元素再次出现时,剩余序列是第一次出现时剩余序列的子序列,所以在第一次出现时,就可以将该元素作为起始的所有递增序列全部求出来。

2024-08-02 23:38:37 189

原创 代码随想录 第七章 回溯算法part03 93.复原IP地址 78.子集 90.子集II

在这题中,主要注意的就是对0的处理,当拿到的字符串第一位是'0'时,就不需要再看0以后是什么,而是将0加入path字符串,判断是否继续穷举。由于要将字符串风味4部分,而'.'只有3个,所以笔者选择在回溯函数中加入一个layer参数,当到最后一块IP地址时,layer==1,此时不再逐位穷举,而是判断第一位是否为0,或直接将剩余字符串转为数字,判断是否符合IP地址要求。这题与此前做到的求取组合的区别在于这题组合的长度可变,所以只要在求取固定长度组合的基础上,对nums可能存在的组合长度进行穷举即可。

2024-07-30 15:14:41 287

原创 代码随想录 第七章 回溯算法part02 39. 组合总和 40.组合总和II 131.分割回文串

相较于上一题,这题的区别在于,所给的数组不仅时乱序,并且有相同的数字重复出现,要保证组合不重复,可以对数组先进行排序,在回溯后,加一个检测下一格数字是否与当前数字相同的循环,避免出现重复组合。这题可以通过substr对字符串逐层分割,每层bt对拿到的字符串从第一位开始寻找是否有回文片段,找到符合回文性质的片段后,将剩余片段传入下一层bt,直到分割出的字符串为空。

2024-07-29 13:45:25 138

原创 代码随想录 第七章 回溯算法part01 77. 组合 216.组合总和III 17.电话号码的字母组合

这题就是在上题求组合的基础上增加求和判断,其实还可以更进一步进行剪枝,比如在循环开始前,根据等差数列和的性质判断是否还有继续遍历的必要。就按照随想录给的回溯模板修改。

2024-07-28 15:46:28 216

原创 代码随想录 第六章 二叉树part08 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

这题要注意的就是树的根节点可能会变,并且由于搜索树的左节点小于节点,右节点大于节点,所以并不能在修建过程中,遇到左节点小于low或右节点大于high就直接将以左节点或右节点为根节点的子搜索树全部删除。左节点小于节点,右节点大于节点,意味着当节点小于low时,节点的左节点及以下节点都小于low,而又节点及以下则有可能大于low,大于high的节点同理。然后从root开始向左右修建,遇到小于low的左节点,就将左节点令为原左节点的右节点,遇到大于high的右节点,就将右节点令为原右节点的左节点。

2024-07-26 22:55:55 159

原创 代码随想录 第六章 二叉树part06 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

因为后序遍历自底向上的遍历顺序,递归过程中,在root节点是p或q的祖先节点时,l与r不会同时为空,而在root的l与r均不为空时,代表p与q分别在root的两侧子树中,代表root为祖先节点,则返回root,索引在递归结束后,返回的一定时最早的祖先节点。也是利用搜索树中序遍历递增的特性。同样是利用单调性质。

2024-07-26 11:51:53 255

原创 代码随想录 第六章 二叉树 part05 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

对两颗树以相同的遍历顺序进行遍历,遇到树1中的空结点,直接将树2的同位置节点转移到树1上,遇到树2的空节点则不用处理。这题的诀窍在于搜索树在中序遍历中是一个单增数列,因此只要验证树在中序遍历中是严格递增的即可。搜索区间内的最大值,以最大值为分界点,得到两个新的区间,直到区间内只有一个元素。

2024-07-25 11:36:06 134

原创 代码随想录 第六章 二叉树 part04 找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树

要注意的就是确认索引范围,确保索引范围内是同一颗子二叉树的中序与后序遍历结果,再根据后序遍历的最后一个元素也就是子二叉树的根,找到再中序遍历中根出现的位置,再确定新的索引范围,直到索引范围内只有一个元素。求最大深度的一种变体,其实只要记录每一个深度第一次出现时节点的值就行。

2024-07-24 11:33:49 187

原创 代码随想录 第六章 二叉树part03 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数

笔者一开始在想先向右深度优先遍历,再通过递归求最底层节点数量,不过显然还是随想录给的思路更简洁,即求左右的深度,若不一致,则分别以左右节点为新的根节点进行递归。计算最大深度,有左右深度差值大于1时,就代表不是平衡二叉树。只要注意时左叶子节点,不是所有左节点就行。

2024-07-23 11:58:20 202

原创 代码随想录 第六章 二叉树 part02 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度

同时对root的左侧和右侧进行层序遍历,本质上是对两侧同时进行广度优先遍历,左侧从左向右遍历,右侧从右向左遍历。递归的本质上是在从root两侧同时做深度优先遍历,左侧优先访问左子节点,右侧优先访问右子节点。只要注意最小深度的求取需要碰到左右子节点都为NULL才能返回值即可。每个节点的子节点互换即可。不难,没什么好说的。

2024-07-22 11:43:10 209

原创 代码随想录 第六章 二叉树part01 递归遍历 统一迭代 层序遍历

迭代遍历可以写得很不一样,因为不同的遍历方式中节点出栈入栈的条件不同,比如在前序遍历中,节点第一次被访问时就可以出栈,并将子节点入栈,在中序遍历中,则需要根据栈顶节点是否有左邻接节点做入栈,根据是否有右节点做出栈。统一迭代遍历通过NULL对要出栈进行读取的节点进行标记,使得代码得以统一。统一迭代遍历中,没有NULL标记的节点出栈后访问子节点,根据不同的遍历种类选择不同的入栈顺序,并使用NULL标记,有NULL标记的节点则出栈后访问val即可。题很多,不过实际上都是队列的新瓶装旧酒,只放最初的层序遍历吧。

2024-07-21 17:12:11 201

原创 代码随想录 第五章 栈与队列part02 150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元素

在窗口滑动的过程中,如果滑出的数字等于队列头的数字,即代表最大的数字已经滑出窗口,队列在队列头进行弹出,对滑入窗口的数字,如果数字大于队列尾的数,那说明队列中的数字都不可能是窗口中最大的数,就将队列清空,将新的数加入队尾,如果小于队列尾的数,则队列中的数都是在滑动过程中可能是窗口中最大的数,所以将该数直接加入队尾。思想上是统计过频率后对频率进行排序,不过这个优先级队列和堆的操作笔者第一次接触,就先依葫芦画瓢了。将数字压入堆栈,遇到计算就弹出两个数进行运算,再压回堆栈即可。

2024-07-20 12:23:10 173

原创 代码随想录 第五章 栈与队列part01 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项

为什么pop的部分不在pop之后把元素从out中吐回in呢,乍一想可能有点抽象,因为就算吐回in后下次pop时最后压入out的元素依然是in的底部,也就是吐回in前,out的顶部,所以不把元素搬回in也完全没影响。将字符串压入堆栈前看栈顶字符是不是和要压入的字符一样,如果一样代表两字符相邻且相等,将栈顶字符弹出,如此往复,直到遍历完字符串即可。

2024-07-19 10:45:07 132

原创 代码随想录 第四章 字符串part02 151.翻转字符串里的单词 卡码网:55.右旋转字符串 28. 实现 strStr() 459.重复的子字符串

next[i]的值是索引i以前字符串中最长的公共前后缀的长度,这个模式串既与s[0]到s[next[i]-1]的部分相同,又与s[i-next[i]]到s[i-1]的部分相同。求取的前缀表中数值在代码中的意义是,在比对过程中,needle字符串中下标为i的字符比对结果为不同时,将i令为next[i]再进行比对,直到找到比对结果相同的i或i到了0。将字符串整体翻转一次后,逐词翻转,去除多余空格的需求也可以借助一下双指针的思想。同样可以借助双指针。

2024-07-18 23:54:46 227

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除