自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 每日一题|2516. 每种字符至少取 K 个|双指针、最长子串、字典

本题需要转化求解目标。对于一个序列,两头收集的最少数量的时候,剩下的部分(我们称之为子串)就会对应的越长。也就是说,我们只要求解一个满足要求的最长子串,使得两边剩余的字符数量刚好满足要求。由于题目需要分别记录固定字符的个数,采用字典进行计算。

2024-09-27 20:19:55 185

原创 每日一题|2535. 数组元素和与数字和的绝对差|数位运算

先加后减就是对于每一个数字之间完成该数字的值-数位和,然后再去下一个数字。特别的,对于小于10的数字,减自身就是0,没必要计算,可以跳过。先加后减,可以剪枝。

2024-09-26 20:15:05 141

原创 每日一题|2306. 公司命名|哈希映射、集合运算

本题可以预想暴力解法是遍历整个数组,分别进行匹配,这样的复杂度是O(n^2),必然超时。所以想到如何进行时间上的简化。对于遍历进行求解,时间主要消耗在“模拟这个过程上”,也就是真的去匹配,而没有关注到题目让求解到仅仅是“数量”。也就是说,如果能够直接从数量上进行运算,将会很方便,也很高效。对于一个数组内的两个元素,strA和strB,交换它们的首字母后,对应的分别是pre_A + suf_B 和 pre_B + suf_A。

2024-09-25 21:20:46 166

原创 代码随想录27期|Python|Day54|​单调栈|​42. 接雨水|84. 柱状图中最大的矩形

根据常识可以归纳出,对于每一列所能够存住的水的高度也就是,当前列的存水高度 = 左侧和右侧柱子的最大高度的较小值,减去当前列的柱子高度,所得到的差值。可以验证第4列:Height = min(2, 3) - 1 = 1,其中2是最左边的最高的柱子(3列)高度,3是右边最高的柱子的高度(7列),1是当前4列的柱子的高度。

2024-09-13 14:12:43 1019

原创 代码随想录27期|Python|Day53|​单调栈|​739. 每日温度|​496. 下一个更大元素 I|​​496. 下一个更大元素 I​

本章开始单调栈的内容。本题翻译过来就是:找每一个元素从这个下标开始,第一个比他大的元素的下标,返回二者之间的距离。,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。由于我们要求的是右侧第一个递增的元素,所以要维护一个从底部到顶部为递增到栈。同时为了记录距离,需要同时伴随一个记录答案的数组。1、比较栈顶下标所指向的元素和遍历到的元素大小,如果比遍历到的元素大,则将遍历到的元素放入栈中;2、如果栈顶元素和遍历到的元素相等,则也将元素放入栈中;

2024-09-13 11:58:14 309

原创 每日一题|2555. 两个线段获得的最多奖品|动态规划、二分法

dp[i]定义为在物品[i]处,有一条长度为k的、右端点不超过i所在位置的线段所能够覆盖的最大奖品数,注意这里不一定要让线段的右端点是i的位置。

2024-09-12 00:02:03 257

原创 代码随想录27期|Python|Day52|​动态规划|​647. 回文子串|516. 最长回文子序列

由图片可知,不同于之前的dp数组直接定义为当前遍历到的位置处题目所要求得值,而是应该定义为i为开始,j为结束的子串是否是回文串。这是因为之前的遍历过程一般都是单向的,而回文串需要两遍同时进行扩展判断,所以不能够只保留遍历到“某一处”位置的回文串个数。所以,dp的定义发生了改变,定义一个子序列是否是回文串。dp[i][j]定义为在i,j区间内的最长回文子串的长度,注意,这里是“包含”回文子串,和上一题的要求“必须以i和j为边界”不同。

2024-09-11 22:38:54 873

原创 代码随想录27期|Python|Day51|​动态规划|​115.不同的子序列|​583. 两个字符串的删除操作​|72. 编辑距离

dp[i][j]表示以i-1和j-1为末尾的字符串中,给定字符串s包含目标字符串t的个数。注意这里不是长度。dp[i][j]表示i-1和j-1位值处的word1和word2,能够匹配到最长字符串所需要删除的字符个数;

2024-09-10 16:41:48 939

原创 代码随想录27期|Python|Day50|​动态规划|​1143. 最长公共子序列|1035. 不相交的线|53. 最大子数组和|392.判断子序列

本题相对于连续最长公共子序列而言,本题不要考虑连续问题,不同的是更新公式的不同。可以看出,dp[i][j]的状态只能由前一个来推导出。也就是更新公式是唯一的,并且需要伴随的记录来保证存到最大值(因为不一定最后一个保存的是最长的)。可以看出,在原来的基础上加上了一个else的操作,也就是,如果当前的dp[i][j]在当前数字上不能被增加的话,就取上一个状态的最大值。上一个状态就是分别在两个字符串中前一个位置的两个状态,一个异步的操作。

2024-09-10 00:36:14 902

原创 代码随想录27期|Python|Day49|​动态规划|​ 300. 最长递增子序列​|674. 最长连续递增序列|718. 最长重复子数组

关于本题,其实需要定义一个二维数组,因为需要在遍历一个数组的同时去遍历另外一个数组。基于初始化的考虑,在更新的时候需要调用前一次,而直接初始化数组第一个位置的dp数组比较麻烦,相当于需要先来遍历一遍了。所以基于此,在dp数组的定义上稍加改动。dp[i][j]表示以nums1的i-1和nums2的j-1为终止位置的最大重复子数组的长度。这样在初始化的时候较为方便。

2024-08-28 02:05:42 465

原创 代码随想录27期|Python|Day48|​动态规划|​ 188.买卖股票的最佳时机IV|309.最佳买卖股票时机含冷冻期|714.买卖股票的最佳时机含手续费

代码随想录Day48完结!!!

2024-08-27 15:13:54 838

原创 代码随想录27期|Python|Day46|​动态规划|​121. 买卖股票的最佳时机|122. 买卖股票的最佳时机II|123. 买卖股票的最佳时机III

和之前必须卖出两次不一样,本题的状态有5种:(1)没有操作(2)第一次买入(3)第一次卖出(4)第二次买入(5)第二次卖出。

2024-08-27 00:41:54 975

原创 代码随想录27期|Python|Day45|​动态规划 |​ 198.打家劫舍| 213.打家劫舍II |337.打家劫舍III

采用一维数组,dp[i]表示当前到第i个物品的时候,所能取得的最大值(i物品不一定被取);

2024-08-17 15:58:26 168

原创 代码随想录27期|Python|Day44|​动态规划|完全背包 |​ 322. 零钱兑换| 279.完全平方数 |139.单词拆分

本题是求最小的组合情况,所以递推公式取较小值:dp[j] = min(dp[j], dp[j-coin]+1);

2024-08-15 01:03:45 399

原创 代码随想录27期|Python|Day43|​动态规划|完全背包 |​518. 零钱兑换 II | 377. 组合总和 Ⅳ |70. 爬楼梯 (进阶)

本题是完全背包问题,也就是在遍历的时候,当前物品可以被重复使用。前面dp被修改了之后后面索引的dp值可以在此基础上进行更新,而0-1背包则需要在上一个物品的基础上进行更新,所以必须保证前面的值不被修改,只能从后往前遍历。和0-1背包从大到小(bagweight 到 weight[i])遍历背包容量不同,完全背包从(weight[i] 到 bagweight)。此外本题还需要注意输入模式的写法。本题是目标和的一个完全背包的变种。需要注意递推公式的写法 dp[j] += dp[j - coin];

2024-08-13 14:44:30 270

原创 代码随想录27期|Python|Day42|​动态规划|1049. 最后一块石头的重量 II|​494. 目标和 | 474.一和零

本题其实是分割成等大子集的变体。也就是说,尽可能将分成两组大小相等的石头,那么最后两组石头做差值,剩下的就是最小的。

2024-08-12 01:13:49 506

原创 代码随想录27期|Python|Day40|​动态规划|背包问题 二维 ​|​背包问题 一维| 416. 分割等和子集

对于不取第i个物品,则当前的背包容量和价值维持上一个物品操作后的dp状态和值,也就是dp[i-1][j]。如果观察二维的数组的更新过程可以发现,下一层的数组完全取决于上一层的数组的值,跟其他的位置没有关系。综上即可得出递推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])。(2)根据第1个物品(行=0)初始化第一行:判断如果背包容量>=物品0的重量,则后面列都是value[0],也就是都是第一个物品的价值。

2024-08-11 17:04:16 1066

原创 代码随想录27期|Python|Day39|​动态规划|62. 不同路径​|​63. 不同路径 II​

由于规定了只能走右边和下边,所以右下角的值等于左对角线的两数之和。1、确定dp和下标:二维数组,i,j分别为行和列,dp值为所需步数;1、对于上边和左边,如果存在障碍,则后续都不可达,退出赋值1的循环;只需要在原来的代码基础上加入一个obstacle数组的同步判断即可。2、 初始化:只有上边和左边全部初始化为1,其余都是0;本质上是一个二维数组遍历,双层for嵌套。3、递推:根据(1)的递推方式给出。2、对于中间区域的障碍,视作0即可;

2024-08-07 01:16:29 256

原创 代码随想录27期|Python|Day38|509斐波那契|738.爬楼梯|746.746. 使用最小花费爬楼梯

可以看到,dp[i]在第三位开始,往前看一位dp[i-1],只有一种情况(就是走1步),往前看两位dp[i-2],只有一种情况(就是走2步,因为走1步的已经算在dp[i-1]里面了)注意到n的范围是30以内,一个更快的方法是直接把这个数组先算出来,然后直接取。3、递推:当前i个的最小花费是取决于前2个dp值和cost的值,取和的最小值。1、确定dp数组和下标的含义:数组的第i个代表走到第i个所需要的最小花费;2、初始化:由于0和1不需要花费,所以dp都是0;所以dp[i]=dp[i-1]+dp[i-2]

2024-08-07 00:34:52 298

原创 代码随想录27期|Python|Day37|56.合并区间|738.单调递增的数字

3、如果大于,则取两个区间右端点较大者为合并后的区间右端点;比如,322变成319再变成299,可以注意到每次操作的都是两位,所以可以使用贪心方法。2、将第一个区间保存在res内,并循环判断res内最后一个区间的右端点和左端点的大小关系;简单题,需要判断上一个区间右边界和下一个区间左边界的大小关系,并作合并。一个数字,当不满足后一位大于等于前一位的时候,最大值是多少?2、比较两位大小,如果不满足递增,前一位-1,后一位变成9;答案是前一位-1,后一位变成9(因为9是最大的数字)。

2024-08-05 23:37:44 254

原创 代码随想录27期|Python|Day35|435. 无重叠区间|763.划分字母区间|56. 合并区间

2、从索引1开始遍历,对于i-1的右边界大于i的左边界的情况,记录一次重合,并且修改i的右边界是i和i-1的最小值。需要注意使用right和left双指针计算区间长度的方法,以及更新右边界的时候是取最大值。关键在于对于重合区间的处理,这里采用的是类似栈的方法,每次仅修改栈最后一个位置的右端点。1,如果重合,直接修改入栈的最后一个区间的右端点为右边界的最大值;2、第二次遍历不断更新右边界为当前遍历到的字母最远距离的最大值;3、在遍历到右边界的时候,保存区间的长度,更新左边界。1、按照区间左边界从小到大排序;

2024-01-22 16:57:55 418

原创 代码随想录27期|Python|Day34|贪心算法|860.柠檬水找零|406.根据身高重建队列|452. 用最少数量的箭引爆气球

这里需要学习一下sort比较的key值的定义:对于传入参数是元组的参数,首先按照元组的第一个位置进行比较,在第一个位置相同的条件下再按照元组的第二个位置进行比较。2,前一个的右边界在当前气球左边界的右边(大于等于),说明重合,不需要累加弓箭数量,但是需要更新当前气球的右边界是二者右边界的最小值。1,手里有10¥和5¥的,直接找即可(5¥既可以找20¥又可以找10¥,所以尽量少消耗5¥);2、遇到10¥的看看有没有5¥的,有的话减少1张5¥,记录1张10¥;2,手里有3张以上的5¥。

2024-01-21 23:35:59 449

原创 代码随想录27期|Python|Day33|贪心算法|1005.K次取反后最大化的数组和|134. 加油站|135. 分发糖果

第二遍,从右往左,如果左边的评分比右边的高,那么此时需要比较“左边经过第一遍之后的糖果”和“右边糖果数量+1”谁更大,取较大值即可。思路比较简单,把所有的负数绝对值大的全部取反之后再在新的数组里把绝对值最小的重复取反即可。本题适合从差值入手,也就是引入一个gas-cost的变量来标记经过每一个车站的剩余油量。第一遍,从左往右,如果右边的比左边评分高,那么右边的比左边多一个糖果;3、由于答案是唯一的,所以最后满足条件的起始位置就是返回的结果。OMG断卡两周再次继续!

2024-01-21 14:13:58 426

原创 代码随想录27期|Python|Day32|122.买卖股票的最佳时机II|55. 跳跃游戏|45.跳跃游戏II

for循环遍历数组,在最大可到达下标值不是本下标(也就不是0)的情况下更新reach的值;一旦找到大于最后一个下标的reach就返回True,否则继续更新,直到当前下标和当前reach相等(说明遇到全部都走到0的情况了)不再更新reach。思路:每一个下标都对应一个最远能到达的下标(reach),只需要检查每一个字符能到达的最大下标即可。本题的思路和昨天的最大子序列和是一致的。在这里有一个计算股价利润的方式:一段时间的总利润 = 这期间每两天之差的和。那么最大利润就是所有的两天之间正数差值的总和。

2024-01-04 21:47:41 434

原创 代码随想录27期|Pthon|Day31|贪心算法|理论基础|455.分发饼干|376. 摆动序列|53. 最大子序和

首先,贪心算法基本靠“做题感觉”,所以没有规范的总结和做题技巧,只能说见到过之后还能想起来。一般情况可以看成是对于一个大的问题的子问题的局部最优的求解,然后可以推导出全局的最优。这个过程没有证明,只能说在“认为没有反例”的情况下“试一试”。

2024-01-04 19:31:50 350

原创 代码随想录27期|Python|Day30|回溯算法|332.重新安排行程|51. N皇后|37. 解数独

本篇题目理解即可。本题需要理解题意:给出的每一个ticket实际上是边,,所以实际上是一个深度优先问题。如果使用回溯的话,和之前的是属于一个类型,但是中间的判断稍微不同。

2023-12-29 19:56:08 840

原创 代码随想录27期|Python|Day29|回溯算法|491.递增子序列|46.全排列|47.全排列 II

比如:[4,5,6,7]和[4,6,5,7]相比,后者就不能选择[5,6,7]这个排列,因为违反了设置的顺序。本题需要明确“层间”还是“树枝”上去重,对于组合问题,前面的数字不能再取,所以是层间去重,回溯的时候不用修改当前层的used数组,但是在树枝上去重的时候,需要在。(1)去重:当且仅当前一个数字已经被遍历,而且现在的数字和之前的是一样的时候,需要continue。1、参数和返回值:和上一题的排列一致,也是全局的used数组加入到模版写法里,返回值为空。,used就是一个用来标记的“伴随”数组。

2023-12-27 17:40:54 913

原创 代码随想录27期|Python|Day28|93.复原IP地址|78.子集|90.子集II

所以我们不是在遍历到叶子节点的时候再进行res的操作,而是需要在每一次回溯的时候进行res的保存。本题是78.子集和40.组合II的杂交题,既要判断去重逻辑,又要保存所有的根节点和叶子节点。今天的好简单,全是模版题!回溯法第一天的模版真的很重要!2、判断是否合法不仅是数值比较,还需要判断是否有前置的0。本题的思路和昨天的分割回文串一样,都是在回溯之前先判断。第28天完结🎉(终于追上进度了。1、终止条件多了一个path。

2023-12-26 21:34:16 365

原创 代码随想录27期|Python|Day27|回溯算法|39.组合总和|40.组合总和II|131.分割回文串

本题需要注意去重:首先对于树进行排序。其次需要明确的是,在一个树枝上是不需要去重的,但是对于同一层,是需要去重的。也就是一个组合内,可以出现重复数字,但是不能两个组合相同。本题的特殊点在于对于数字的分割,需要传入下一层级的其实是分割之后的子序列,其次还有对于回文字判断,相当于在回溯前加了一个if条件。所以需要在i遍历的时候先判读是不是重复的,然后再递归。也就是平行移动的时候需要考虑,但是在纵向移动的时候不用。

2023-12-26 20:19:14 466

原创 代码随想录27期|Python|Day25|回溯算法|216.组合总和III|17.电话号码的字母组合

本题和之前一题的区别就是字符个数放开,但是可用数字变成了[1, 9]。思路和之前的某个找二叉树最大值比较像,复用前一天的题目的代码,假如一个count = n的全局变量即可。

2023-12-25 16:43:30 545

原创 代码随想录27期|Python|Day24|回溯法|理论基础|77.组合

回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。回溯函数也就是递归函数,指的都是一个函数。

2023-12-24 17:03:25 471

原创 代码随想录27期|Day23|二叉树|669. 修剪二叉搜索树|108.将有序数组转换为二叉搜索树|538.把二叉搜索树转换为累加树

代码随想录第23天完结🎉。

2023-12-23 15:56:42 424

原创 代码随想录27期|Python|Day22|二叉树|235. 二叉搜索树的最近公共祖先|701.二叉搜索树中的插入操作|450.删除二叉搜索树中的节点

听首歌吧http://本题题干给出是BST,所以需要好好利用这个性质。首先,如果一个节点是共同祖先,那么首先要满足值在,才能成为根节点。但是,满足这个情况的节点可能有很多,但是最近的只有一个。比如下图:通过观察可以发现,如果从最顶端开始遍历,那么的节点就是我们要找的共同祖先。

2023-12-22 19:57:12 895

原创 代码随想录27期|Python|Day21|二叉树| 530.二叉搜索树的最小绝对差| 501.二叉搜索树中的众数| 236. 二叉树的最近公共祖先

特别需要注意题目中给的隐藏信息(比如这里的BST)前两个是BST的经典递归模版解法,后面一个迭代的解法可以当作BST的一般迭代规则。

2023-12-21 22:16:41 778

原创 代码随想录27期|Python|Day20|654.最大二叉树|617.合并二叉树|700.二叉搜索树中的搜索|98.验证二叉搜索树

本题需要注意的是切片操作,可以跟构造二叉树的切片操作对比。需要注意:1、只能使用的方式;2、被取出的数组元素()需要在;3、循环不变量都是左闭右开区间。1、在的时候,终止return None,但是对于两个合并的情况,需要在。相当于“嫁接”2、返回值选择一棵主要遍历的树。本题给出两种(递归、迭代) 方法。1、需要新建一个;2、搜索二叉树BST满足的条件,所以,不需要考虑采用何种搜索顺序;3、推荐使用迭代。

2023-12-21 16:15:36 417

原创 代码随想录27期|Python|Day18|二叉树|路径总和i&ii|找树左下角的值|从中序与后序遍历序列构造二叉树

第一次刷的时候题解都不是精简版。

2023-12-19 22:27:50 922

原创 代码随想录27期|Python|Day17|二叉树|110.平衡二叉树 |257. 二叉树的所有路径 |404.左叶子之和

在递归后序遍历的基础上加上一个中间节点判断左右子节点的高度的步骤即可。)的格式,显然使用前序遍历可以保存从中间节点开始的遍历顺序。这里在一般的中序遍历基础上考虑回溯(判断当前节点是否是左叶子节点必须依赖其。首先确定遍历顺序,由于输出的结果是(本题也可以使用迭代算法+栈解决。第17天结束OMGGGGGG🎉。,在逐层向上返回之后可以。

2023-12-18 22:34:16 448

原创 代码随想录27期|Python|Day16|二叉树|104.二叉树的最大深度|111.二叉树的最小深度|222.完全二叉树的节点个数

二叉树专题,重点掌握后续的递归和中间节点的处理。本题在前一章已经解决了层序遍历的解法,现在来聊一下递归法。。(注意,起始位置的值都是1),到当前位置所在节点的层数;高度:从开始,到当前所在节点的层数。再来说一下选择什么顺序来遍历。:从root出发,直接找的是深度;:从叶子节点出发,返回给root节点高度。也就是说,不管选择哪一种,中间节点都是单独处理的。

2023-12-17 11:27:27 944 1

原创 代码随想录27期|Python|Day15|二叉树|层序遍历|对称二叉树|翻转二叉树

本文图片来源:代码随想录。

2023-12-14 20:29:18 1872 1

原创 代码随想录27期|Python|Day14|二叉树|递归遍历|迭代遍历|统一迭代

注意面试需要会手写代码的节点定义!!!!# 相比链表,多出了一个指针指向另一个子节点。

2023-12-13 10:42:16 913 1

空空如也

空空如也

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

TA关注的人

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