代码随想录
文章平均质量分 75
代码随想录27期刷题思路与题解
Lily_Mei
I'm trying, at least.
展开
-
代码随想录27期|Python|Day1|数组基础|二分查找[两种边界](704、35、34、69)|移除元素[双指针](27、26、383、844、977)
1、二分查找可以用于搜索数组数值类,需要注意选取的区间对于判断条件取等号、是否需要-1等的影响;2、双指针解决数组修改类,需要注意单向和双向两种思路;3、注意一些循环和判据的细节(for range和while的区别)。第一天结束🎉O%28n%29。原创 2023-11-29 20:54:17 · 1007 阅读 · 2 评论 -
代码随想录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 · 980 阅读 · 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 · 810 阅读 · 0 评论 -
代码随想录27期|Python|Day2|滑动窗口209(904、76)|螺旋矩阵59
本人偷懒,但是看到随想录星球里面已经有老哥总结了mindmap,所以引用如下:第二天完结🎉。原创 2023-12-01 19:54:06 · 393 阅读 · 1 评论 -
代码随想录27期|Python|Day5|哈希表基础|242.有效的字母异位词|349. 两个数组的交集|202. 快乐数|1. 两数之和
在做面试题目的时候遇到需要判断一个元素是否出现过的场景应该第一时间想到哈希法!(比如链表专题遇到的判断是否有环)但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。204.有效的字母异位词。原创 2023-12-04 12:10:16 · 1287 阅读 · 0 评论 -
代码随想录27期|Python|Day9|字符串总结|双指针总结|KMP初探(28. 实现 strStr()、 459.重复的子字符串)
字符串题目总结:代码随想录 (programmercarl.com)题目总结可以看代码随想录,注意需要结合题目!不只是看方法论,特别是对于内存和时间要求高的。代码随想录 (programmercarl.com)原创 2023-12-09 11:39:35 · 1291 阅读 · 1 评论 -
代码随想录27期|Python|Day3|链表基础|203移除链表元素、707设计链表、206反转链表
链表和数组在需要手动free内存,但是会自动回收内存。原创 2023-12-01 22:46:28 · 587 阅读 · 1 评论 -
代码随想录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 · 372 阅读 · 1 评论 -
代码随想录27期|Python|Day30|回溯算法|332.重新安排行程|51. N皇后|37. 解数独
本篇题目理解即可。本题需要理解题意:给出的每一个ticket实际上是边,,所以实际上是一个深度优先问题。如果使用回溯的话,和之前的是属于一个类型,但是中间的判断稍微不同。原创 2023-12-29 19:56:08 · 843 阅读 · 0 评论 -
代码随想录27期|Python|Day22|二叉树|235. 二叉搜索树的最近公共祖先|701.二叉搜索树中的插入操作|450.删除二叉搜索树中的节点
听首歌吧http://本题题干给出是BST,所以需要好好利用这个性质。首先,如果一个节点是共同祖先,那么首先要满足值在,才能成为根节点。但是,满足这个情况的节点可能有很多,但是最近的只有一个。比如下图:通过观察可以发现,如果从最顶端开始遍历,那么的节点就是我们要找的共同祖先。原创 2023-12-22 19:57:12 · 895 阅读 · 0 评论 -
代码随想录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 · 924 阅读 · 0 评论 -
代码随想录27期|Python|Day27|回溯算法|39.组合总和|40.组合总和II|131.分割回文串
本题需要注意去重:首先对于树进行排序。其次需要明确的是,在一个树枝上是不需要去重的,但是对于同一层,是需要去重的。也就是一个组合内,可以出现重复数字,但是不能两个组合相同。本题的特殊点在于对于数字的分割,需要传入下一层级的其实是分割之后的子序列,其次还有对于回文字判断,相当于在回溯前加了一个if条件。所以需要在i遍历的时候先判读是不是重复的,然后再递归。也就是平行移动的时候需要考虑,但是在纵向移动的时候不用。原创 2023-12-26 20:19:14 · 475 阅读 · 0 评论 -
代码随想录27期|Python|Day11|栈与队列|20. 有效的括号|1047. 删除字符串中的所有相邻重复项|150. 逆波兰表达式求值
本题一个比较好的思路是遇到左括号入栈右括号,然后遍历到右括号的时候弹出右括号即可。需要单独开一个存储空间,来一边接收新遍历到的字符,一边和之前的比较,原创 2023-12-10 17:55:18 · 395 阅读 · 1 评论 -
代码随想录27期|Python|Day21|二叉树| 530.二叉搜索树的最小绝对差| 501.二叉搜索树中的众数| 236. 二叉树的最近公共祖先
特别需要注意题目中给的隐藏信息(比如这里的BST)前两个是BST的经典递归模版解法,后面一个迭代的解法可以当作BST的一般迭代规则。原创 2023-12-21 22:16:41 · 781 阅读 · 0 评论 -
代码随想录27期|Python|Day32|122.买卖股票的最佳时机II|55. 跳跃游戏|45.跳跃游戏II
for循环遍历数组,在最大可到达下标值不是本下标(也就不是0)的情况下更新reach的值;一旦找到大于最后一个下标的reach就返回True,否则继续更新,直到当前下标和当前reach相等(说明遇到全部都走到0的情况了)不再更新reach。思路:每一个下标都对应一个最远能到达的下标(reach),只需要检查每一个字符能到达的最大下标即可。本题的思路和昨天的最大子序列和是一致的。在这里有一个计算股价利润的方式:一段时间的总利润 = 这期间每两天之差的和。那么最大利润就是所有的两天之间正数差值的总和。原创 2024-01-04 21:47:41 · 436 阅读 · 0 评论 -
代码随想录27期|Python|Day14|二叉树|递归遍历|迭代遍历|统一迭代
注意面试需要会手写代码的节点定义!!!!# 相比链表,多出了一个指针指向另一个子节点。原创 2023-12-13 10:42:16 · 915 阅读 · 1 评论 -
代码随想录27期|Python|Day25|回溯算法|216.组合总和III|17.电话号码的字母组合
本题和之前一题的区别就是字符个数放开,但是可用数字变成了[1, 9]。思路和之前的某个找二叉树最大值比较像,复用前一天的题目的代码,假如一个count = n的全局变量即可。原创 2023-12-25 16:43:30 · 547 阅读 · 0 评论 -
代码随想录27期|Python|Day13|栈与队列|239. 滑动窗口最大值 (一刷至少需要理解思路)|347.前 K 个高频元素 (一刷至少需要理解思路)
2、建立小顶堆,按照从大到小的顺序放入键值对,当队列的长度大于k的时候,开始从最小值节点pop元素,留下k个最大值;heapq.heappop()是从堆的根节点弹出值,大顶堆弹出最大值,小顶堆弹出最小值。滑动窗口中的队列一直保持出口大,入口小的顺序。heapq.heappush()是往堆中添加新值。3、倒序输出最大值对应的key即可。,需要先和当前队列的头部元素比较,1、首先遍历数组建立map键值对;(也就是滑动窗口移动后),都需要。所以只需要按照出现频率排序。先和入口的元素比较大小。原创 2023-12-12 09:49:35 · 503 阅读 · 0 评论 -
代码随想录27期|Python|Day18|二叉树|路径总和i&ii|找树左下角的值|从中序与后序遍历序列构造二叉树
第一次刷的时候题解都不是精简版。原创 2023-12-19 22:27:50 · 924 阅读 · 0 评论 -
代码随想录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 · 370 阅读 · 1 评论 -
代码随想录27期|Python|Day28|93.复原IP地址|78.子集|90.子集II
所以我们不是在遍历到叶子节点的时候再进行res的操作,而是需要在每一次回溯的时候进行res的保存。本题是78.子集和40.组合II的杂交题,既要判断去重逻辑,又要保存所有的根节点和叶子节点。今天的好简单,全是模版题!回溯法第一天的模版真的很重要!2、判断是否合法不仅是数值比较,还需要判断是否有前置的0。本题的思路和昨天的分割回文串一样,都是在回溯之前先判断。第28天完结🎉(终于追上进度了。1、终止条件多了一个path。原创 2023-12-26 21:34:16 · 367 阅读 · 0 评论 -
代码随想录27期|Python|Day24|回溯法|理论基础|77.组合
回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。回溯函数也就是递归函数,指的都是一个函数。原创 2023-12-24 17:03:25 · 478 阅读 · 0 评论 -
代码随想录27期|Pthon|Day31|贪心算法|理论基础|455.分发饼干|376. 摆动序列|53. 最大子序和
首先,贪心算法基本靠“做题感觉”,所以没有规范的总结和做题技巧,只能说见到过之后还能想起来。一般情况可以看成是对于一个大的问题的子问题的局部最优的求解,然后可以推导出全局的最优。这个过程没有证明,只能说在“认为没有反例”的情况下“试一试”。原创 2024-01-04 19:31:50 · 351 阅读 · 0 评论 -
代码随想录27期|Python|Day20|654.最大二叉树|617.合并二叉树|700.二叉搜索树中的搜索|98.验证二叉搜索树
本题需要注意的是切片操作,可以跟构造二叉树的切片操作对比。需要注意:1、只能使用的方式;2、被取出的数组元素()需要在;3、循环不变量都是左闭右开区间。1、在的时候,终止return None,但是对于两个合并的情况,需要在。相当于“嫁接”2、返回值选择一棵主要遍历的树。本题给出两种(递归、迭代) 方法。1、需要新建一个;2、搜索二叉树BST满足的条件,所以,不需要考虑采用何种搜索顺序;3、推荐使用迭代。原创 2023-12-21 16:15:36 · 418 阅读 · 0 评论 -
代码随想录27期|Day23|二叉树|669. 修剪二叉搜索树|108.将有序数组转换为二叉搜索树|538.把二叉搜索树转换为累加树
代码随想录第23天完结🎉。原创 2023-12-23 15:56:42 · 424 阅读 · 0 评论 -
代码随想录27期|Python|Day15|二叉树|层序遍历|对称二叉树|翻转二叉树
本文图片来源:代码随想录。原创 2023-12-14 20:29:18 · 1885 阅读 · 1 评论 -
代码随想录27期|Python|Day16|二叉树|104.二叉树的最大深度|111.二叉树的最小深度|222.完全二叉树的节点个数
二叉树专题,重点掌握后续的递归和中间节点的处理。本题在前一章已经解决了层序遍历的解法,现在来聊一下递归法。。(注意,起始位置的值都是1),到当前位置所在节点的层数;高度:从开始,到当前所在节点的层数。再来说一下选择什么顺序来遍历。:从root出发,直接找的是深度;:从叶子节点出发,返回给root节点高度。也就是说,不管选择哪一种,中间节点都是单独处理的。原创 2023-12-17 11:27:27 · 945 阅读 · 1 评论 -
代码随想录27期|Python|Day17|二叉树|110.平衡二叉树 |257. 二叉树的所有路径 |404.左叶子之和
在递归后序遍历的基础上加上一个中间节点判断左右子节点的高度的步骤即可。)的格式,显然使用前序遍历可以保存从中间节点开始的遍历顺序。这里在一般的中序遍历基础上考虑回溯(判断当前节点是否是左叶子节点必须依赖其。首先确定遍历顺序,由于输出的结果是(本题也可以使用迭代算法+栈解决。第17天结束OMGGGGGG🎉。,在逐层向上返回之后可以。原创 2023-12-18 22:34:16 · 449 阅读 · 0 评论 -
代码随想录27期|Python|Day52|动态规划|647. 回文子串|516. 最长回文子序列
由图片可知,不同于之前的dp数组直接定义为当前遍历到的位置处题目所要求得值,而是应该定义为i为开始,j为结束的子串是否是回文串。这是因为之前的遍历过程一般都是单向的,而回文串需要两遍同时进行扩展判断,所以不能够只保留遍历到“某一处”位置的回文串个数。所以,dp的定义发生了改变,定义一个子序列是否是回文串。dp[i][j]定义为在i,j区间内的最长回文子串的长度,注意,这里是“包含”回文子串,和上一题的要求“必须以i和j为边界”不同。原创 2024-09-11 22:38:54 · 891 阅读 · 0 评论 -
代码随想录27期|Python|Day54|单调栈|42. 接雨水|84. 柱状图中最大的矩形
根据常识可以归纳出,对于每一列所能够存住的水的高度也就是,当前列的存水高度 = 左侧和右侧柱子的最大高度的较小值,减去当前列的柱子高度,所得到的差值。可以验证第4列:Height = min(2, 3) - 1 = 1,其中2是最左边的最高的柱子(3列)高度,3是右边最高的柱子的高度(7列),1是当前4列的柱子的高度。原创 2024-09-13 14:12:43 · 1037 阅读 · 0 评论 -
代码随想录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 · 301 阅读 · 0 评论 -
代码随想录27期|Python|Day44|动态规划|完全背包 | 322. 零钱兑换| 279.完全平方数 |139.单词拆分
本题是求最小的组合情况,所以递推公式取较小值:dp[j] = min(dp[j], dp[j-coin]+1);原创 2024-08-15 01:03:45 · 401 阅读 · 0 评论 -
代码随想录27期|Python|Day45|动态规划 | 198.打家劫舍| 213.打家劫舍II |337.打家劫舍III
采用一维数组,dp[i]表示当前到第i个物品的时候,所能取得的最大值(i物品不一定被取);原创 2024-08-17 15:58:26 · 180 阅读 · 0 评论 -
代码随想录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 · 1080 阅读 · 0 评论 -
代码随想录27期|Python|Day42|动态规划|1049. 最后一块石头的重量 II|494. 目标和 | 474.一和零
本题其实是分割成等大子集的变体。也就是说,尽可能将分成两组大小相等的石头,那么最后两组石头做差值,剩下的就是最小的。原创 2024-08-12 01:13:49 · 511 阅读 · 0 评论 -
代码随想录27期|Python|Day37|56.合并区间|738.单调递增的数字
3、如果大于,则取两个区间右端点较大者为合并后的区间右端点;比如,322变成319再变成299,可以注意到每次操作的都是两位,所以可以使用贪心方法。2、将第一个区间保存在res内,并循环判断res内最后一个区间的右端点和左端点的大小关系;简单题,需要判断上一个区间右边界和下一个区间左边界的大小关系,并作合并。一个数字,当不满足后一位大于等于前一位的时候,最大值是多少?2、比较两位大小,如果不满足递增,前一位-1,后一位变成9;答案是前一位-1,后一位变成9(因为9是最大的数字)。原创 2024-08-05 23:37:44 · 267 阅读 · 0 评论 -
代码随想录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 · 456 阅读 · 0 评论 -
代码随想录27期|Python|Day50|动态规划|1143. 最长公共子序列|1035. 不相交的线|53. 最大子数组和|392.判断子序列
本题相对于连续最长公共子序列而言,本题不要考虑连续问题,不同的是更新公式的不同。可以看出,dp[i][j]的状态只能由前一个来推导出。也就是更新公式是唯一的,并且需要伴随的记录来保证存到最大值(因为不一定最后一个保存的是最长的)。可以看出,在原来的基础上加上了一个else的操作,也就是,如果当前的dp[i][j]在当前数字上不能被增加的话,就取上一个状态的最大值。上一个状态就是分别在两个字符串中前一个位置的两个状态,一个异步的操作。原创 2024-09-10 00:36:14 · 915 阅读 · 0 评论 -
代码随想录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 · 280 阅读 · 0 评论 -
代码随想录27期|Python|Day49|动态规划| 300. 最长递增子序列|674. 最长连续递增序列|718. 最长重复子数组
关于本题,其实需要定义一个二维数组,因为需要在遍历一个数组的同时去遍历另外一个数组。基于初始化的考虑,在更新的时候需要调用前一次,而直接初始化数组第一个位置的dp数组比较麻烦,相当于需要先来遍历一遍了。所以基于此,在dp数组的定义上稍加改动。dp[i][j]表示以nums1的i-1和nums2的j-1为终止位置的最大重复子数组的长度。这样在初始化的时候较为方便。原创 2024-08-28 02:05:42 · 472 阅读 · 0 评论