LeetCode算法刷题
文章平均质量分 72
记录日常的力扣刷题
Sundw_RUC
人民大学在校研究生
展开
-
LeetCode算法刷题(python) Day43|09动态规划|343. 整数拆分、96.不同的二叉搜索树
进行拆分,然后对这些求最大值。正整数n,先拆成两个数。原创 2023-10-18 09:08:08 · 268 阅读 · 0 评论 -
LeetCode算法刷题(python) Day42|09动态规划|62.不同路径、63. 不同路径 II
本题就是添加了障碍,只需保证dp数组在障碍的位置始终是0即可。原创 2023-10-18 09:06:36 · 238 阅读 · 0 评论 -
LeetCode算法刷题(python) Day41|09动态规划|理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
时,到达第n个台阶的最后一步可以爬1个台阶也可以爬2个台阶,如果爬1个台阶,那么前面的种数就跟n-1个台阶的情况一样;如果爬2个台阶,那么跟n-2个台阶的情况一样。如果是1个台阶,只有一种方法,如果有两个台阶也只有两种方法,这就是动规的初始值。这不就是不同初始值的斐波那契数列吗!当然,本题也可以用动态规划,是最简单的问题。本题代码实际跟上一题斐波那契数一样。本题最直观是用递归方法。原创 2023-10-18 09:05:00 · 252 阅读 · 0 评论 -
LeetCode算法刷题(python) Day39|08贪心算法|738.单调递增的数字、968.监控二叉树
此外还需考虑空节点的状态,空节点是叶子节点的子节点,为了在叶子节点的父节点上放摄像头,叶子节点应是无覆盖状态,则空节点应是有覆盖状态,才能满足情况一使得叶子节点无覆盖。这三种情况囊括了所有情况,递归返回的值为根结点的状态,如果此时根结点未被覆盖(情况一的特殊情况,即根结点没有父节点),需要在根结点加一个摄像头。:摄像头可以覆盖上中下三层,如果将摄像头放在叶子节点上就浪费了一层覆盖范围,所有优先放在叶子节点的父节点上,然后隔两个节点放一个摄像头。原创 2023-10-14 09:35:04 · 176 阅读 · 0 评论 -
LeetCode算法刷题(python) Day38|08贪心算法|435. 无重叠区间、763.划分字母区间、56. 合并区间
本题与区间调度问题类似,找到最多的互不相交区间之后,剩余的区间就是要移除区间的最小数量。:先统计出每个字母的索引区间,然后就是区间调度问题,寻找一些互不相交的区间。的闭区间,请你设计一个算法,算出这些区间中最多有几个互不相交的区间。,你的算法应该返回 2。注意边界相同并不算相交。,这些区间最多有 2 个区间互不相交,即。区间合并问题,与上一题类似。原创 2023-10-13 08:31:38 · 111 阅读 · 0 评论 -
LeetCode算法刷题(python) Day37|08贪心算法|860. 柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球
本题还是区间调度问题,求最多互不相交的区间,唯一的区别是区间的边界,如果箭头触碰到气球的边界也会爆炸,所以边界触碰也算重叠。原创 2023-10-12 10:13:21 · 107 阅读 · 0 评论 -
LeetCode算法刷题(python) Day36|08贪心算法|1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果
在当前数组最小的数前加负号。如果当前最小的数是负数,那么变为正数可以最大程度增大当前数值;如果当前最小数为非负数,说明当前数组已没有负数,把最小数变成负数损失最小。:让绝对值大的负数变为正数,可以使得当前数值达到最大,时间复杂度。然而这种做法每次变号之后要重新排序,时间复杂度为。原创 2023-10-11 11:26:46 · 47 阅读 · 0 评论 -
LeetCode算法刷题(python) Day35|08贪心算法|122.买卖股票的最佳时机II、 55. 跳跃游戏、45.跳跃游戏II
6],比其他的都大。实现代码的逻辑就是如果后一天的价格比前一天高,高出来的部分就加入到利润中,如果低就不算。你看,这就是贪心选择性质,我们不需要「递归地」计算出所有选择的具体结果然后比较求最值,而只需要做出那个最有「潜力」,看起来最优的选择即可。但是,真的需要「递归地」计算出每一个子问题的结果,然后求最值吗?比如上图这种情况,我们站在索引 0 的位置,可以向前跳 1,2 或 3 步,你说应该选择跳多少呢?动态规划中,每一步都要循环子问题,找出最少步数,这是动态规划时间复杂度高的原因。原创 2023-10-10 23:05:20 · 130 阅读 · 0 评论 -
LeetCode算法刷题(python) Day34|08贪心算法|455.分发饼干、376. 摆动序列、53. 最大子序和
先将小孩胃口和饼干大小排序,因为默认从小到大排序,为了代码方便,我们选择小饼干满足小胃口的策略。先拿最小的饼干给胃口最小的小孩,如果满足就继续后面的饼干和小孩,如果不满足这块饼干就不行了,换大一点的饼干。如果当前子数组的和小于0,说明它会拉低后面子数组的和,那么应该抛弃它,从下一个数开始求和。在计算是否有峰值的时候,大家知道遍历的下标 i ,计算。本题把图画出来会好理解一些。此时就有波动就需要统计。原创 2023-10-09 14:03:48 · 58 阅读 · 0 评论 -
LeetCode算法刷题(python) Day32|07回溯算法|332.重新安排行程、51. N皇后、37. 解数独
本题可以每次在一行中填皇后,递归n次。在每一行填皇后的时候,有n个选择,判断当前选择是否合法,如果合法填进去之后再递归下一行。其实只需先排序,一旦找到满足条件的路径即可返回,不用继续搜索了,一定是最小的。最开始没有考虑清楚这个排序。修改答案,其实就是每个格往里填,符合条件就填,不符合就返回False。第一次做的时候超时了,原创 2023-10-07 09:56:00 · 151 阅读 · 0 评论 -
LeetCode算法刷题(python) Day31|07回溯算法|491.递增子序列、46.全排列、47.全排列 II
此时按照之前的写法会出现重复。去重的逻辑是,在同一树层,相同的元素不能重复用了,因为前面会把可能的情况都搜到;不同层是可以用的,判断一下是否满足递增条件即可。本题在全排列的基础上涉及去重,在树层上,前面用的数字后面重复出现了就应该剪枝,否则会出现重复的排列;在树枝上是可以出现重复的。数组对应元素为0,因为用过该元素之后,通过回溯去掉之后变为0,所以如果此时添加这个元素会进行重复搜索。,这就是同一层前面已经用过的元素。其次本题需要注意去重,比如。数组标记排列中已取的元素。本题是排列问题,使用。原创 2023-10-06 15:32:53 · 68 阅读 · 0 评论 -
LeetCode算法刷题(python) Day30|07回溯算法|93.复原IP地址、78.子集、90.子集II
本题需要注意去重,现将数组排序,遍历搜索时下一个元素与当前元素相同是,就不需要搜索了,会出现重复的。本题就是一个很经典的分割问题。本题一次性通过,爽!原创 2023-10-04 23:46:38 · 77 阅读 · 0 评论 -
LeetCode算法刷题(python) Day29|07回溯算法|39. 组合总和、40.组合总和II、131.分割回文串
取出子串后判断是否是回文串,如果是进入下一层递归,如果不是就不进入递归,到这里就终止了。中包含的多个相同元素),但树层方向用过的元素就不要再用了,因为这样势必会搜出重复的组合。本题是一个切割问题,关键就是遍历选取切割线的位置。在组合问题中,确定一个。包含重复元素,且其中的每个元素只能用一次,解集中不能包含重复组合。这意味着在树枝方向,是可以有相同元素的(个元素后面添加切割线,此时切割的子串就是。本题的关键在于 如何去重,题目强调。个元素加入组合,切割问题中。,就没有必要继续搜索了。时,后面的肯定都大于。原创 2023-10-04 15:11:36 · 114 阅读 · 0 评论 -
LeetCode算法刷题(python) Day28|07回溯算法|216.组合总和III、17.电话号码的字母组合
回溯算法,本题可以进行剪枝操作,若当前和已经超过了目标和,就没有必要继续遍历下去了,因为后面的一定也会超过目标和,那么这些就可以剪枝掉。回溯算法,回溯函数需要输入一个index,指定当前循环遍历哪个数字代表的字母。原创 2023-10-04 15:09:08 · 93 阅读 · 0 评论 -
LeetCode算法刷题(python) Day27|07回溯算法|理论基础、77. 组合
回溯算法模板框架。原创 2023-10-04 12:07:22 · 84 阅读 · 0 评论 -
LeetCode算法刷题(python) Day23|06二叉树|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
每次取中点分隔成左右两个区间,递归的构建左右子树。逆中序遍历,记录当前累加和,并更新节点值。原创 2023-10-04 11:57:03 · 53 阅读 · 0 评论 -
LeetCode算法刷题(python) Day22|06二叉树|235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
在二叉搜索树中,一定可以找到一个叶子节点的位置插入元素。利用二叉搜索树的性质,原创 2023-10-04 10:42:01 · 49 阅读 · 0 评论 -
LeetCode算法刷题(python) Day21|06二叉树|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
本题需要自底向上查找,而二叉树回溯的过程就是自底向上查找。后序遍历(左右中)就是天然的回溯过程,根据左右子树的返回值处理中间节点的逻辑。二叉搜索树的中序遍历是一个递增序列,最小绝对差一定出现在相邻两个元素之间。本题也可以不用额外数组空间,在遍历的过程中记录最小绝对差。利用二叉搜索树的性质,中序遍历查找众数。原创 2023-10-03 23:22:39 · 51 阅读 · 0 评论 -
LeetCode算法刷题(python) Day20|06二叉树|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
先合并头节点,如果都是空的,返回None,如果只有一个空,返回非空的那个,如果都非空,则返回头节点值为二者之和的,并递归的合并左右子树。与构造二叉树类似的思路,先取最大值作为头节点,然后最大值左侧和右侧的分别递归的构造左右子树。二叉搜索树的中序遍历是一个递增序列。利用二叉搜索树的性质进行递归搜索。原创 2023-09-25 09:13:15 · 44 阅读 · 0 评论 -
LeetCode算法刷题(python) Day18|06二叉树|513.找树左下角的值、112. 路径总和、113.路径总和ii、106.从中序与后序遍历序列构造二叉树 、105.从前序与中序遍历序
按照遍历顺序层层切割,递归构造二叉树。层序遍历,最下边一层最左边的值。原创 2023-09-25 00:18:02 · 60 阅读 · 0 评论 -
LeetCode算法刷题(python) Day17|06二叉树|110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和
本题判断的是左叶子,其实需要找左叶子的父节点,否则无法判断当前叶子是左叶子还是右叶子。所以递归算法中,root为空和root为叶子都应该返回0,当root.left是左叶子时,返回左叶子的值。递归计算每个节点左右子树的高度。就是回溯算法最简单的应用。原创 2023-09-24 23:24:38 · 47 阅读 · 0 评论 -
LeetCode算法刷题(python) Day16|06二叉树|104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数
层序遍历,当访问到叶子节点时返回当前深度。层序遍历,求最大深度。原创 2023-09-24 22:33:41 · 47 阅读 · 0 评论 -
LeetCode算法刷题(python) Day15|06二叉树|102. 层序遍历、226. 翻转二叉树、101.对称二叉树
先将头节点的左右子树交换,然后递归地交换翻转子树。原创 2023-09-23 16:08:52 · 67 阅读 · 0 评论 -
LeetCode算法刷题(python) Day14|06二叉树|二叉树的递归遍历、迭代遍历、统一迭代遍历
144. 二叉树的前序遍历145. 二叉树的后序遍历94. 二叉树的中序遍历。原创 2023-09-19 16:25:21 · 77 阅读 · 0 评论 -
LeetCode算法刷题(python) Day|08贪心算法|
是选择每一阶段的局部最优,从而达到全局最优。原创 2023-09-17 21:40:54 · 163 阅读 · 0 评论 -
LeetCode算法刷题(python) Day12|05栈与队列|239. 滑动窗口最大值、347.前 K 个高频元素
也就是队列中每个元素左边没有比它小的元素,因为比它小的不会成为当前窗口的最大值,没有必要维护,从而保证队列最左端元素是当前窗口的最大值。本题使用小顶堆,因为我们要取前k个高频元素,当队列中元素大于k时需要弹出元素,此时弹出的应该是最小元素,所以要使用小顶堆。本题使用单调队列的方法,并且是一个双端队列,搞清楚队列哪些元素从左边弹出哪些从右边弹出很重要。窗口滑过之后不在窗口内的元素从左边弹出,新加入元素之前比较队列内比该元素小的从右边弹出。方法分别加入和弹出元素。是树中每个节点值都不小于左右孩子节点,原创 2023-09-15 23:35:55 · 65 阅读 · 0 评论 -
LeetCode算法刷题(python) Day|07回溯算法|216. 组合总和III、17. 电话号码的字母组合
本题与组合问题不同的是,每次遍历的集合是不一样的。组合问题的回溯函数中使用了start表示当前从哪个数字开始遍历,但本题需要指定的是当前遍历到第几个数字,从而把对应的字母集合取出来,在这个集合中进行遍历。本题与LeetCode 77. 组合基本一致,只是增加了总和的限制,仍然使用回溯算法。原创 2023-09-15 23:27:43 · 183 阅读 · 0 评论 -
LeetCode算法刷题(python) Day|07回溯算法|77. 组合
回溯法也可以叫回溯搜索法,是一种搜索的方式。回溯是递归的副产品,有递归就会有回溯。原创 2023-09-15 14:45:56 · 100 阅读 · 0 评论 -
LeetCode算法刷题(python) Day11|05栈与队列|20. 有效的括号、1047. 删除字符串中的所有、150. 逆波兰表达式求值
如果是运算符,则将栈顶的两个元素拿出来进行运算,再将结果放入栈。也就是队列中每个元素左边没有比它小的元素,因为比它小的不会成为当前窗口的最大值,没有必要维护,从而保证队列最左端元素是当前窗口的最大值。本题使用小顶堆,因为我们要取前k个高频元素,当队列中元素大于k时需要弹出元素,此时弹出的应该是最小元素,所以要使用小顶堆。本题使用单调队列的方法,并且是一个双端队列,搞清楚队列哪些元素从左边弹出哪些从右边弹出很重要。本题实际上是要使用优先级队列的方法,也就是小顶堆,它的底层是一颗完全二叉树。原创 2023-09-15 11:25:27 · 69 阅读 · 0 评论 -
LeetCode算法刷题(python) Day10|05栈与队列|232. 用栈实现队列、225.用队列实现栈
python中的列表可以完美的模拟栈的操作,append, pop。原创 2023-09-14 14:57:54 · 120 阅读 · 0 评论 -
LeetCode算法刷题(python) Day8|04字符串|344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋
本题主要是复用上一题的代码,在循环遍历的时候只要每次移动2k个,然后反转前k个字符就行了。另外根据python的特性,如果一个字符串或列表如。当然我们还是回归本题要考察的知识点。,不会发生越界的错误,因此可以简化代码。我们回归本题要考察的知识点,双指针。可以分别反转,然后整体反转。本题同样可以一句话,原创 2023-09-13 22:34:29 · 49 阅读 · 0 评论 -
LeetCode算法刷题(python) Day7|03哈希表|454. 四数相加II、15. 三数之和、18. 四数之和
这可以转化为一个排序+递归+两数之和的问题,穷举前面。分别在i后面的数组开头和结尾,这样就可以控制。对于nsum问题来说,有一个博客写的方法特别好,个数并求后面的两数之和。需要注意的就是去重,系列问题的核心思路就是排序 + 双指针。你返回所有和为 0 且不重复的三元组。的值,就可以返回任意个数求和的结果了。注意:答案中不可以包含重复的三元组。先给数组从小到大排序,然后双指针。,如果你想让它俩的和小一些,就让。如果你想让它俩的和大一些,就让。本题不适合用哈希法,适合用。个数,使得它们的和为。原创 2023-09-12 23:51:14 · 144 阅读 · 0 评论 -
LeetCode算法刷题(python) Day6|03哈希表|242.有效的字母异位词、349. 两个数组的交集、 202. 快乐数、1. 两数之和
通过这个表可以看出,三位数的位平方和不可能大于243,这也是一个三位数,那么它的位平方和就会更小,直到进入循环或者跌到1。本题使用map这种哈希结构(python中的字典),对于每一次遍历到的数字,我们在哈希表中key存放数值,value存放下标,同时在哈希表中查找。:本题可以用一个字典记录出现元素的次数,遍历另一个数组时每当遇到一个出现过的元素,将次数减一,并记录这个数即可。的限制,本题是不适合用数组的哈希方式的,因为如果数据比较分散会浪费很多空间,本题最合适的哈希方式是set。原创 2023-09-11 14:28:39 · 197 阅读 · 0 评论 -
LeetCode算法刷题(python) Day4|02链表|24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II
本题比较容易,对于两个可能相交的单链表来说,不失一般性,我们假设A比B长,那么A比B长的这一部分中一定不会出现相交的节点。判断有环可以用快慢指针法,定义快指针每次走两个节点,慢指针每次走一个节点,如果快慢指针相遇了,则说明有环。:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。简单来说就是把此时的快指针挪到头节点,然后快慢指针以每次一个节点的相同速度前进,当它们再次相遇时,即为环的入口。:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。,返回链表开始入环的第一个节点。原创 2023-09-10 16:12:22 · 53 阅读 · 0 评论 -
LeetCode算法刷题(python) Day3|02链表|203.移除链表元素 ,707.设计链表 ,206.反转链表
单链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null。指针的入口节点称为链表的头节点,head。双链表的每个节点有两个指针域,一个指向下一个节点,一个指向上一个节点,也就是既可以向前查询也可以向后查询。循环链表就是链表首尾相连,可以用来解决约瑟夫环问题。数组在内存中是连续分布的,但是链表在内存中不是连续分布的。链表是通过指针域的指针链接内存中各个节点。如下图中的链表,起始节点为2,终止节点为7,各个原创 2023-09-09 23:46:50 · 145 阅读 · 0 评论 -
LeetCode算法刷题(python) Day2|01数组|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
定一个一个窗口[i, j],起始就是[0, 0],当总和小于target时,右移j,记录此时的长度并将i 右移直到总和小于target,此时可以继续右移j。求解本题关键是坚持循环不变量原则,只有按照相同的规则,才能把每一条边画下来。本题暴力解法是使用两个for循环,不断遍历找出满足条件的连续子数组,时间复杂度为。右移直到当前子序列的和小于target不满足条件,否则所取的子列可能不是最短的。滑动窗口就是不断调整子序列的起始和终止位置,得到我们想要的结果。,返回你可以收集的水果的。,返回矩阵中的所有元素。原创 2023-09-07 22:50:24 · 171 阅读 · 0 评论 -
LeetCode算法刷题(python) Day1|01数组|704. 二分查找、27.移除元素
本题最直接的方法就是暴力解法,两层for循环,一层for循环遍历数组,当遇到要删除的值时,另一层for循环更新数组。中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而。你不需要考虑数组中超出新长度后面的元素。= [2,2,0,0],也会被视作正确答案。= [2,2,0,0],也会被视作正确答案。的元素,并返回移除后数组的新长度。= [2,2,3,3] 或。= [2,2,3,3] 或。原创 2023-09-06 10:36:58 · 466 阅读 · 0 评论