力扣算法题
文章平均质量分 57
当年拼却醉颜红
这个作者很懒,什么都没留下…
展开
-
力扣爆刷第144天之二叉树四连刷(完结二叉搜索树改变树结构)
思路:删除二叉搜索树中的节点,这种改变树结构类型的题目,一定都是在树的遍历过程中,构造树,这个是一个解题的模板,也就是递归函数的返回值要作为父节点的左孩子或者右孩子。在遍历的过程中构建树,如果当前节点不在范围内,则直接返回子树结果(就是在结果树中剔除了当前节点),如果当前结果在范围内,则构建树,即用root的左右孩子接收递归寻找结果。思路:让把二叉搜索树改成累加树,累加树的要求是新节点为原节点加上比它大的所有节点,所以利用中序遍历的特性,采用右,中,左的方式进行遍历累加即可。原创 2024-05-26 17:26:46 · 164 阅读 · 0 评论 -
力扣爆刷第143天之二叉树五连刷(二叉搜索树)
思路:求最近公共祖先,非常简单,因为要求祖先,所以使用后续遍历,后续遍历,可以拿到左右子树的遍历结果,只需要比较当前节点是否是q或者p,是的话就返回。思路:求二叉搜索树的最近公共祖先,需要利用二叉搜索树的特性,从上往下进行搜索,通过全部大于或者全部小于决定递归方向,一旦当前节点的大小介于q和p之间,则该节点一定是最近公共祖先。思路:本题记录众数需要中序遍历二叉搜索树,利用递增的特性,方便统计,统计时,前后元素不等置1,相等累加,如果数值大于最大值,则情况记录数组,如果等于则添加。这样是符合众数的定义的。原创 2024-05-24 23:28:39 · 157 阅读 · 0 评论 -
力扣爆刷第142天之二叉树五连刷(构造树、搜索树)
题目链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/题目链接:https://leetcode.cn/problems/search-in-a-binary-search-tree/description/题目链接:https://leetcode.cn/problems/merge-two-binary-trees/description/原创 2024-05-23 22:46:56 · 437 阅读 · 0 评论 -
力扣爆刷第141天之二叉树十连刷(翻转、对称、深度、平衡、路径)
思路:本题和上一题略有差异,上一题是求所有左叶子节点的和,要求的是左叶子节点,本题类似于树的左视图,但是是深度最深的哪一行的最左边的那个节点,它可能是左节点也可能是右节点。只需要前序遍历,利用深度,当深度第一次大于记录值时,说明是第一次到达下一层,而且采用的是前序遍历,到达的是下一层的最左边的叶子节点。思路:求左叶子之和,求的是所有的左叶子的和,所以只需要做两件事情,一件是在叶子节点进行判断,另外一件是提供每个节点的信息,用于判断当前节点是否是叶子节点,这种信息需要从父节点传递,所以在递归函数的参数中。原创 2024-05-22 21:51:52 · 535 阅读 · 0 评论 -
力扣爆刷第141天之二叉树十连刷(层序遍历)
题目链接:https://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii/description/题目链接:https://leetcode.cn/problems/find-largest-value-in-each-tree-row/description/思路:N叉树的层序遍历,比二叉树来说,只是多了几个叉,不需要在直接写左右子树了,直接一个for循环,把子节点全遍历出来。思路:层序遍历,使用队列完成,经典题目。原创 2024-05-20 23:07:21 · 867 阅读 · 0 评论 -
力扣爆刷第140天之栈与队列七连刷(表达式求值、高频元素)
思路:用两个栈模拟一个队列,只需要一个栈只用于接收元素,另一个栈只用于弹出元素,只要添加元素,就添加到第一个栈,只要弹出元素,就看看第二个栈是否为空,为空就把第一个栈内的元素都放入第二个栈内,就可以,这样就把元素从先进后出,变成了先进先出。思路:求滑动窗口的最大值,直接自己写一个队列类,在类的内部提供维护滑动窗口的函数,只要是添加元素,小于当前元素的都要出队,此时队列内部保存的正是单调递减的元素,要获取最大值即是队列头部,要删除元素也仅仅是与队头做比较,相当则删除。原创 2024-05-19 15:36:56 · 691 阅读 · 0 评论 -
力扣爆刷第139天之字符串七连刷(翻转双指针)
题目链接:https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/思路:和上一题类型,本题要求右旋字符串,只需要把区间 [0, len-k-1] 和 [len-k, len-1]区间先各自翻转,然后再整体[0, len-1]翻转,即可实现右旋。题目链接:https://leetcode.cn/problems/reverse-string-ii/description/原创 2024-05-17 15:55:12 · 372 阅读 · 0 评论 -
力扣爆刷第138天之哈希表五连刷(二三四数之和)
思路:四数之和可以转化为两数之和,然后按照两数之和的做法来做。题目链接:https://leetcode.cn/problems/two-sum/description/题目链接:https://leetcode.cn/problems/4sum-ii/description/题目链接:https://leetcode.cn/problems/3sum/description/题目链接:https://leetcode.cn/problems/4sum/description/原创 2024-05-14 22:39:21 · 262 阅读 · 0 评论 -
力扣爆刷第137天之哈希表五连刷(环形链表哈希表)
题目链接:https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/description/思路:用两个set,第一个set收集第一个数组的元素,然后遍历第二个数组,看看元素是否存在于第一个set中,存在就加入第二个set中,第二个set中的就是交集。若最后数组不全为0则非法。思路:求链表相交的位置,很简单的题目,直接求两个链表的长度,然后长度提前走几步,走到长度相等,然后同步走,并且判断。原创 2024-05-12 20:06:38 · 431 阅读 · 0 评论 -
力扣爆刷第136天之链表五连刷(双指针快慢指针)
题目链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/题目链接:https://leetcode.cn/problems/remove-linked-list-elements/description/思路:删除指定节点,使用双指针,一个记录前一个节点,一个记录当前节点,记录前一个节点的用于删除元素。思路:直接三个指针,pro和p和pre,前两个指针用于交换位置,后一个指针用于记录下一个交换的元素。原创 2024-05-10 22:59:30 · 287 阅读 · 0 评论 -
力扣爆刷第135天之数组五连刷(双指针快慢指针滑动窗口)
题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/description/题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/description/题目链接:https://leetcode.cn/problems/spiral-matrix-ii/description/思路:移出相同元素,经典快慢指针,元素不等慢指针才走。原创 2024-05-09 23:20:13 · 439 阅读 · 3 评论 -
力扣爆刷第134天之单调栈五连刷(经典接雨水)
如果要求某一个数左边或者右边第一个比他大或者比他小的数,这种题就是典型的单调栈解法。原创 2024-05-08 23:26:39 · 468 阅读 · 0 评论 -
力扣爆刷第133天之动态规划收尾(距离编辑与回文子串)
如果word1[i] == word2[j],那么所需次数依赖于word1[i-1]和word2[j-1],即dp[i][j] = dp[i-1][j-1]。如果word1[i]!= word2[j],那么增删对应的都是dp[i-1][j],dp[i][j-1],替换对应的是dp[i-1][j-1],取三者最低。也可以使用动态规划,定义dp[i][j]表示,区间s[i,j]是回文子串,dp[i][j]依赖于dp[i+1][j-1],也就是当前位置的左下方。原创 2024-05-07 16:28:34 · 447 阅读 · 0 评论 -
力扣爆刷第132天之动态规划五连刷(子序列问题)
本节的题目均是上一节四种类型的变体。原创 2024-05-04 18:20:27 · 657 阅读 · 0 评论 -
力扣爆刷第131天之动态规划五连刷(子序列问题)
定义dp[i][j]表示在区间text1[0, i]和区间text2[0, j]上以text1[i]和text2[j]为结尾的最长相等子序列,那么如果text1[i] == text2[j],那么dp[i][j] = dp[i-1][j-1] + 1,dp数组一定是依赖于上一个位置的状态,也就是text1[i-1]与text2[j-1]的情况。= text2[j] ,那么dp[i][j] = Math.max(dp[i][j-1], dp[i-1][j]),如果结尾不等,就从各退一步的状态里寻找最长结果。原创 2024-05-02 15:45:50 · 610 阅读 · 0 评论 -
力扣爆刷第130天之动态规划五连刷(一网打尽买卖股票全家桶)
对于买卖股票问题,是一个特殊的问题,每一天都有两种状态:即持有股票,和不持有股票。每一种状态又有两种选择:即今天才持有,和之前就已经持有。或者今天才不持有,和之前就已经不持有。搞清楚这个就简单了,因为动态规划无非就是状态与选择,剩下的变体就是买卖次数的不同。原创 2024-05-01 18:05:31 · 814 阅读 · 0 评论 -
力扣爆刷第129天之动态规划五连刷(完全平方数、单词拆分、打劫劫舍)
思路:本题和最少零钱兑换是一样的,都是完全背包求最小数量,但是求的是用的物品的最小数量,这个物品不用区分组合还是排序,只要是最小数量就可以,所以完全背包,物品和背包谁内谁外都可以,不影响,定义dp[i]表示背包为N时装满所需的最小物品数量为dp[i]。思路:打家劫舍是一个经典问题,不能连续偷一家,所以对于每天有两种选择,即偷与不偷,偷的话,就依赖于前前家的结果,不偷的话,就依赖于前一天,故dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i])。然后分别在两个区间上去求最大值。原创 2024-04-29 16:40:06 · 387 阅读 · 0 评论 -
力扣爆刷第128天之动态规划五连刷(一个零、零钱兑换、组合)
背包问题:一维数组,dp[j] = Math.max(dp[j], dp[j-nums[i]] + nums[i])。先物品后背包,物品正序,背包逆序。如若背包正序则会出现同一个物品重复放入,如物品1重量为1,背包空间为1时放入了,背包空间为2时又放入了。如果先背包后物品,为了避免重复放入背包依然是逆序,背包容量固定时,每种背包容量只能放入一个物品,即为最大的物品,小的物品都放不进来或者被覆盖了。求组合数排列数:dp[j] += dp[j - nums[i]]物品背包没有先后顺序,物品背包都是正序。原创 2024-04-26 22:21:25 · 887 阅读 · 0 评论 -
力扣爆刷第127天之动态规划五连刷(整数拆分、一和零、背包)
背包问题:一维数组,dp[j] = Math.max(dp[j], dp[j-nums[i]] + nums[i])。题目链接:https://leetcode.cn/problems/last-stone-weight-ii/description/思路:求最后一块是否的重量,就是两两抵消,求最后剩余的无法抵消的数,转换思路想一想其实就是尽量把石头分成两堆大小接近的堆,然后比较最小差值,所以题目就转变成了0 1背包问题,总数和的一半作为背包,求的结果后,乘2与总数相减即得最后一块是否的重量。原创 2024-04-25 23:09:52 · 851 阅读 · 0 评论 -
力扣爆刷第126天之动态规划五连刷(斐波那契、爬楼梯、不同路径)
思路:花费最小代价爬楼梯,每次只能爬1步或者2步,定义dp[i]表示到达nums[i]时所花费的最小值,故状态转移方程为dp[i] = nums[i]+Math.min(dp[i-1], dp[i-2])。思路:求不同路径,定义dp[i][j]表示,达到num[i][j]处有几种方法,每次只能往右方或者下方走一步,所以dp[i][j]依赖的是dp[i][j-1]和dp[i-1][j]故,dp[i][j]=dp[i][j-1]+dp[i-1][j]。原创 2024-04-24 21:41:06 · 399 阅读 · 0 评论 -
力扣爆刷第125天之回溯五连刷(全排列、N皇后、数独)
思路:本题求全排列,集合元素有重复,所以不仅要纵向去重,也需要横向去重,纵向去重需要使用used数组,纵向标记,递归返回时清楚,不影响横向,横向去重需要排序,让相同元素挨在一起,而且横向是递归返回之后的for横向遍历,所以前一个位置得是false,才行。题目链接:https://leetcode.cn/problems/permutations-ii/description/思路:求全排列,元素无重,所以递归不需要起始索引,但是需要纵向去重,纵向去重使用flag数组,纵向标记去重,横向不影响。原创 2024-04-23 21:11:39 · 348 阅读 · 4 评论 -
力扣爆刷第124天之回溯五连刷
题目链接:https://leetcode.cn/problems/non-decreasing-subsequences/description/思路:求非递减子序列,不能排序,集合有重复元素,要达到横向去重,需要使用set,每次递归向下都是一个新的set,横向for循环是同一个。题目链接:https://leetcode.cn/problems/subsets-ii/description/题目链接:https://leetcode.cn/problems/subsets/description/原创 2024-04-22 22:44:13 · 499 阅读 · 4 评论 -
力扣爆刷第123天之回溯五连刷
题目链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/思路:集合元素有重,不可复选,求和为K的组合数,数组和排序,排序后,纵向不去重,横向去重,横向只需要大于初始索引,前后两个值想对,即去重。思路:集合无重,元素可复选,求和为K的组合数,向下递归索引位置为i不用加1,确保单个元素可以复选,排序后可以早停。思路:元素无重,不可复选,要求和为n的k个数的组合,只需要简单的判断和早停,其他套模板。原创 2024-04-19 22:44:30 · 678 阅读 · 0 评论 -
力扣爆刷第122天之CodeTop100五连刷96-100
思路:堆排的思想是先从最后一个非叶子节点开始向下递归交换,直到根节点也完成了向下大小交换,此时就构建一个大根堆,只不过左右孩子的顺序不能保证,接下来就从最后一个元素开始与根节点交换,然后向下递归交换,直到所有的节点都完成从上往下交换,即可完成升序排序。思路:序列化与反序列化,序列化正常前序遍历,需要用占位符划分好节点和null值。题目链接:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/description/原创 2024-04-19 00:05:34 · 484 阅读 · 2 评论 -
力扣爆刷第121天之CodeTop100五连刷91-95
题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-list/description/思路:利用栈来做,用一个符号位记录运算符,当再次遇到运算符时,就把之前记录的数和之前的运算符相运算,入栈,更新运算符,最后注意边界条件,别漏掉最后一个数的计算。下面用动态规划来做,定义dp[i]表示以s[i]为结尾的字符串可以被表示出来,故,只要当前这一段可以被表示出来,那么当前位置的状态取决于上一段的结尾。全局变量计数,统计即可。原创 2024-04-17 23:09:04 · 267 阅读 · 0 评论 -
力扣爆刷第120天之CodeTop100五连刷86-90
思路:所有的数字拼接成字符串之后的最大字符串,这里利用一个原理,两个字符串,如果x+y > y+x 那么就表示x > y,这个大于是指字符串拼接的前后顺序,更大的应该在前。题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/思路:求不同路径,非常简单,每个节点来自于他的左边和上边,故dp[i][j]=dp[i][j-1]+dp[i-1][j]。不持有的话,分为今天才不持有,和之前就不持有。原创 2024-04-17 20:32:51 · 374 阅读 · 0 评论 -
力扣爆刷第119天之CodeTop100五连刷81-85
思路:最长重复子数组是连续的子数组,定义dp[i][j]表示,以nums1[i]和nums2[j]为结尾的区间的最长重复子数组,根据这个定义,若nums1[i]!思路:列表无序,也不要求顺序,求最长连续序列,还要求O(N),那么就不能排序了,可以利用set集合,如果连续一定是一段一段的,我们只需要找到每一个连续段的开头,从这个地方开始技术,全部统计完就可以,注意,只从连续段的头开始计算。思路:本题求最大宽度,是需要利用满二叉树的特性的,采用前序遍历,给每一个节点编号,root=id,左孩子=id。原创 2024-04-16 22:57:37 · 787 阅读 · 0 评论 -
力扣爆刷第118天之CodeTop100五连刷76-80
思路:求最大的正方形,可以定义dp[i][j]表示nums[i][j]=1时,且以它为右下角的正方形的最长边长,有了定义以后就要想办法找出状态之间的转移,右下角是依赖于左边,上边,左上角的,关系如何传递?右下角的边长应该是这三个边长中最短的加1。思路:题目要求时间复杂度log n,显然要使用二分查找,不过本题的二分查找因为没有一个明确的目的,是要去左区间还是右区间,那就是全部都要去,都要遍历,所以就是一个二叉树的遍历,相当于要前序遍历二叉树,剩下的就是判断和边界条件了,以及早停。原创 2024-04-13 00:25:56 · 628 阅读 · 0 评论 -
力扣爆刷第117天之CodeTop100五连刷71-75
题目链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/description/思路:采用二分查找,分别查找左边界和右边界,注意边界条件,越界和不符合的返回-1;原创 2024-04-12 00:05:17 · 428 阅读 · 0 评论 -
力扣爆刷第116天之CodeTop100五连刷66-70
思路:可以采用概率组合,我们可以先用rand7构造出来一个p=0.2,再构造出来一个p=0.5,这两个事件构成一个事件的概率为p=0.1正好可以达到要求,例如先随机出来一个1-6的数,奇数偶数出现的概率为0.5,范围只要是偶数就行,然后我们再随机出来一个1-5的数,因为我们只放出来1-5,就相当于袋子里只有5个数,那每种数出现的概率就为0.2,然后组合到一块,判断第一个数是奇数还是偶数,通过这个返回1-5或者6-10。思路:直接中序遍历,用一个变量记录前一个节点,然后中序遍历比较,如果不是,直接早停返回。原创 2024-04-11 00:20:18 · 280 阅读 · 0 评论 -
力扣爆刷第115天之CodeTop100五连刷61-65
思路:使用栈,栈内存索引,遇到左括号,入栈,遇到右括号出栈,故栈底要初始化一个值,来满足计算括号长度,举例(),可以压入-1,左括号再压入0,右括号来了,0出栈,i= 1,减去栈顶的-1,长度为2,初始化验证完毕。思路:判断是否是二叉树,关键在于每个节点的左右子树高度差不能大于1,所以一直后序遍历求深度,在其过程中判断是否非法,非法记录全局变量,即可,另外可以早停利用全局变量。题目链接:https://leetcode.cn/problems/symmetric-tree/description/原创 2024-04-08 23:50:19 · 445 阅读 · 0 评论 -
力扣爆刷第114天之CodeTop100五连刷56-60
题目链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/思路:很典型的题目,递归构造二叉树,为了节省时间,先用一个map记录下来根节点在中序的索引,通过这个索引,可以确定左右子树各有多少元素,由此可以敲定边界条件,把握住这个思路就可以。题目链接:https://leetcode.cn/problems/min-stack/description/原创 2024-04-08 00:16:43 · 331 阅读 · 0 评论 -
力扣爆刷第113天之CodeTop100五连刷51-55
思路:零钱数量无限,正序遍历,求达到总数所需的最少硬币数,定义dp[i]表示,装满 i 所需的最少硬币数,那么,动态规划的状态转移,一定是从上一个硬币位置开始的,也就是 i - coins[j],这个位置,即 dp[i - coins[j]],上一个硬币位置只要是有值的,那么就可以推导出状态转移,是dp[i]=dp[i - coins[j]] + 1,当然还得再和自身历史值进行比较,留下最小值。思路:典型滑动窗口,维护好一个变量值,作为进入滑动窗口的契机,没进入时扩大右边界,进入时,缩小左边界。原创 2024-04-07 00:24:48 · 412 阅读 · 0 评论 -
力扣爆刷第112天之CodeTop100五连刷46-50
题目链接:https://leetcode.cn/problems/compare-version-numbers/description/题目链接:https://leetcode.cn/problems/generate-parentheses/description/题目链接:https://leetcode.cn/problems/add-two-numbers/description/题目链接:https://leetcode.cn/problems/sort-list/description/原创 2024-04-06 00:43:25 · 326 阅读 · 0 评论 -
力扣爆刷第111天之CodeTop100五连刷41-45
这个是我简单画的一个图,可以理解为一个折线图,要寻找下一个排列,我们只需要从右边开始往左找,找到第一个小于自己的值,这个值需要由右侧第一个大于他的值进行交换,然后右侧是降序的,只需要翻转即可正序。思路:类似于归并排序,但我们只需要归并到一半即可,然后控制条件在一个while内完成两个数组的遍历,避免i<len1 && j < len2的情况,这样需要遍历多次,外加多次判断。思路:用两个栈来模拟队列,分别为s1和s2,入队只往s1加,出队,s2不空,s2出,s2空了把s1的全部出栈然后再压入s2中,再出队。原创 2024-04-04 23:38:42 · 307 阅读 · 0 评论 -
力扣爆刷第110天之CodeTop100五连刷36-40
思路:定义dp[i][j]表示以text1[i]和text2[j]为结尾的最长公共子序列,利用这个定义,进行状态推导,如果结尾元素相等,自然各由上一个位置推出,dp[i][j] = dp[i-1][j-1] + 1。题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/description/题目链接:https://leetcode.cn/problems/binary-search/description/原创 2024-04-02 22:46:44 · 251 阅读 · 0 评论 -
力扣爆刷第109天之CodeTop100五连刷31-35
思路:编辑距离,定义dp[i][j]表示以word1[i]和word2[j]为结尾的字符串要相等所需的最少改动,如果word[i]==word[j]那么状态自然可以从上一个状态推导出来,即dp[i][j] = dp[i-1][j-1];如word[i]!= word[j],可以考虑增加、删除、修改,可从三个方向推导出来,dp[i][j] = Math.min(Math.min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1])+1;原创 2024-04-01 23:09:59 · 626 阅读 · 0 评论 -
力扣爆刷第108天之CodeTop100五连刷26-30
思路:求最长递增子序列的长度,是非连续的,一层for是解决不了的,定义dp[i]表示区间[0, i]以nums[i]为结尾的最长递增子序列的长度,求dp[i]就要遍历[0,i],每一个位置利用定义进行推导,nums[j]<nums[i],dp[j]是以nums[j]为结尾的区间的最大长度,那么dp[i]=dp[j]+1。思路:利用单调栈,构造凹槽即可,栈内递减,当前元素大于栈顶,栈顶出栈,出来的这个为凹槽底部,然后利用当前元素为右边界,当前栈顶为左边界,结合出栈的凹槽底部进行雨水容量计算。原创 2024-03-30 22:43:05 · 493 阅读 · 0 评论 -
力扣爆刷第107天之CodeTop100五连刷21-25
思路:本题要求每层先从左往右遍历,下一层从右往左,再往下一层又变成了从左往右遍历,就是这种交替遍历,其实层序遍历的方式我们不需要改变,只需要改变记录的方式,对于每层出队节点收集时,如果该层是要求正序,那么把元素从尾部添加进新队列,如果该层要求逆序,那就从头部添加进队列,因为尾插法是正序,头插法是逆序,遍历后,然后再把收集到的数据添加进总集合中即可。题目链接:https://leetcode.cn/problems/intersection-of-two-linked-lists/description/原创 2024-03-28 22:58:26 · 456 阅读 · 0 评论 -
力扣爆刷第106天之CodeTop100五连刷16-20
题目链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/题目链接:https://leetcode.cn/problems/merge-sorted-array/description/题目链接:https://leetcode.cn/problems/linked-list-cycle/description/思路:遇到左括号,添加右括号,如果是右括号,栈为空报错,栈非空看栈顶,不同报错。原创 2024-03-28 00:11:57 · 441 阅读 · 0 评论