自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

2024-08-28 02:05:42 451

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

代码随想录Day48完结!!!

2024-08-27 15:13:54 816

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

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

2024-08-27 00:41:54 955

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

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

2024-08-17 15:58:26 152

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

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

2024-08-15 01:03:45 388

原创 代码随想录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 260

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

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

2024-08-12 01:13:49 498

原创 代码随想录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 1048

原创 代码随想录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 244

原创 代码随想录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 295

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

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

2024-08-05 23:37:44 238

原创 代码随想录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 411

原创 代码随想录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 441

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

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

2024-01-21 14:13:58 419

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

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

2024-01-04 21:47:41 424

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

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

2024-01-04 19:31:50 343

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

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

2023-12-29 19:56:08 837

原创 代码随想录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 897

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

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

2023-12-26 21:34:16 362

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

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

2023-12-26 20:19:14 452

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

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

2023-12-25 16:43:30 535

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

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

2023-12-24 17:03:25 463

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

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

2023-12-23 15:56:42 419

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

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

2023-12-22 19:57:12 890

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

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

2023-12-21 22:16:41 774

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

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

2023-12-21 16:15:36 413

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

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

2023-12-19 22:27:50 919

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

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

2023-12-18 22:34:16 441

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

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

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

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

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

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

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

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

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

原创 代码随想录27期|Python|Day13|栈与队列|239. 滑动窗口最大值 (一刷至少需要理解思路)|347.前 K 个高频元素 (一刷至少需要理解思路)

2、建立小顶堆,按照从大到小的顺序放入键值对,当队列的长度大于k的时候,开始从最小值节点pop元素,留下k个最大值;heapq.heappop()是从堆的根节点弹出值,大顶堆弹出最大值,小顶堆弹出最小值。滑动窗口中的队列一直保持出口大,入口小的顺序。heapq.heappush()是往堆中添加新值。3、倒序输出最大值对应的key即可。,需要先和当前队列的头部元素比较,1、首先遍历数组建立map键值对;(也就是滑动窗口移动后),都需要。所以只需要按照出现频率排序。先和入口的元素比较大小。

2023-12-12 09:49:35 497

原创 代码随想录27期|Python|Day11|栈与队列|20. 有效的括号|1047. 删除字符串中的所有相邻重复项|150. 逆波兰表达式求值

本题一个比较好的思路是遇到左括号入栈右括号,然后遍历到右括号的时候弹出右括号即可。需要单独开一个存储空间,来一边接收新遍历到的字符,一边和之前的比较,

2023-12-10 17:55:18 380 1

原创 代码随想录27期|Python|Day10|队列与栈的基础|232.用栈实现队列|225. 用队列实现栈

4、STL 队列也不被归类为容器,而被归类为container adapter( 容器适配器)。3、STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。可以把队列看成是两头开的栈,也可以理解是两个背靠背的栈,在输入输出过程完成了一次copy元素。2、所以栈不提供走访功能,也不提供迭代器(iterator);2、同样不允许有遍历行为,不提供迭代器;1、所有元素必须符合先进后出规则;1、队列中先进先出的数据结构;

2023-12-09 17:01:25 358 1

原创 代码随想录27期|Python|Day9|字符串总结|双指针总结|KMP初探(28. 实现 strStr()、 459.重复的子字符串)

字符串题目总结:代码随想录 (programmercarl.com)题目总结可以看代码随想录,注意需要结合题目!不只是看方法论,特别是对于内存和时间要求高的。代码随想录 (programmercarl.com)

2023-12-09 11:39:35 1261 1

原创 代码随想录27期|Python|Day8|字符串基础|344.反转字符串|541. 反转字符串II|卡码网:54.替换数字|151.翻转字符串里的单词|卡码网:55.右旋转字符串

栈实现库函数reverse实现(算法题尽量不用)541. 反转字符串 II - 力扣(LeetCode)这道题的思路比较绕,总体来说就是先确定每一次的起始位置,然后判断后面是否需要交换,不过好在range函数自带的特性不会超出索引范围,所以不管后面是大于k且小于2k还是小于k,都可以实现交换,无需特地去比较边界。[::-1]切片反转法(推荐使用,更加贴合Python本身的操作)151. 反转字符串中的单词 - 力扣(LeetCode)本题需要学习的是原地操作列表的

2023-12-07 22:27:18 808

原创 代码随想录27期|Python|Day7|哈希表|454.四数相加II|383. 赎金信|15. 三数之和|18. 四数之和

由于,所以只需要即可。(如果需要去重,则需要考虑别的方法)。首先嵌套遍历A和B,找出全部的a+b组合构成hashmap;然后嵌套遍历C和D,找出全部hashmap表中满足-(c+d)== a+b的非空value,返回全部的组合的总和。注意!!这里count统计全部组合的时候不是count++,而是count += value,因为不需要去重。

2023-12-06 17:18:15 955 1

原创 代码随想录27期|Python|Day5|哈希表基础|242.有效的字母异位词|349. 两个数组的交集|202. 快乐数|1. 两数之和

在做面试题目的时候遇到需要判断一个元素是否出现过的场景应该第一时间想到哈希法!(比如链表专题遇到的判断是否有环)但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。204.有效的字母异位词。

2023-12-04 12:10:16 1264

原创 代码随想录27期|Python|Day4|24、两两交换链表中的节点|19、删除链表的倒数第N个节点|面试题02.07.链表相交|142、环形链表II

Step 3:接着A被穷尽了,curA跳转到B的开头,此时curB所在的位置是距离A的结尾lenB个位置的地方;双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。Step 2:此时B被穷尽了,curB跳转到A的开头,此时curA所在的位置超前curB正好是lenB个位置;这里的相交不是值相等,而是指针相等,所以不能采取一一对应的遍历的方式,而嵌套for带来时间上开销太大。注意,最终return的是cur,是第一次交换的cur。

2023-12-03 20:39:06 366 1

原创 代码随想录27期|Python|Day3|链表基础|203移除链表元素、707设计链表、206反转链表

链表和数组在需要手动free内存,但是会自动回收内存。

2023-12-01 22:46:28 564 1

空空如也

空空如也

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

TA关注的人

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