- 博客(192)
- 资源 (1)
- 收藏
- 关注
原创 leetcode-32. 最长有效括号
1)遍历字符串,如果是左括号,就直接入栈;如果是右括号且栈里已经有括号了,说明已经有成对的括号出现了;将栈的顶部括号pop出来,当前的也放入res数组里。的字符串,找出最长有效(格式正确且连续)括号。3)接下来,在res数组里,找到最长的。最长有效括号子串是 "()()"最长有效括号子串是 "()"一般括号问题都需要一个辅助栈。2)对res数组进行排序。
2024-09-30 15:35:33 269
原创 leetcode-23. 合并 K 个升序链表
请你将所有链表合并到一个升序链表中,返回合并后的链表。给你一个链表数组,每个链表都已经按升序排列。ps:这道题看一眼代码,很好写出来。将它们合并到一个有序链表中得到。
2024-09-23 20:54:29 160
原创 leetcode-10. 正则表达式匹配
因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。".*" 表示可匹配零个或多个('*')任意字符('.')。"a" 无法匹配 "aa" 整个字符串。动态规划,这道题挺难理解的。的,而不是部分字符串。,请你来实现一个支持。
2024-09-23 19:52:59 415
原创 leetcode-4. 寻找两个正序数组的中位数
合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5。合并数组 = [1,2,3] ,中位数 2。请你找出并返回这两个正序数组的。的正序(从小到大)数组。算法的时间复杂度应该为。二分查找,参考官方题解。
2024-09-17 23:23:26 210
原创 leetcode-560. 和为 K 的子数组
2)字典记录:当前位置累加和出现的次数。PS:需初始化{0:1}3)遍历数组,如果前缀和-k在字典中,count+=字典中的次数。子数组是数组中元素的连续非空序列。1)变量pre用来记录前缀的累加和。
2024-09-17 17:54:30 343
原创 leetcode-581. 最短无序连续子数组
你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。2)两个数组先从start开始对比,找到不一样的数字。3)两个数组再从end开始对比,找到不一样的数字。子数组,并输出它的长度。1)先构建一个有序数组。
2024-09-12 16:46:01 247
原创 leetcode-647. 回文子串
3)遍历顺序:一定要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的。当s[i]与s[j]不相等,那没啥好说的了,dp[i][j]一定是false。整体上是两种,就是s[i]与s[j]相等,s[i]与s[j]不相等这两种。6个回文子串: "a", "a", "a", "aa", "aa", "aaa"当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况。三个回文子串: "a", "b", "c"是字符串中的由连续字符组成的一个序列。是正着读和倒过来读一样的字符串。
2024-09-12 14:32:38 460
原创 leetcode-617. 合并二叉树
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;1)如果没有root1,return root2。2)如果没有root2,return root1。null 的节点将直接作为新二叉树的节点。合并过程必须从两个树的根节点开始。3)根结点处理:两节点值加和。4)遍历两棵树的左节点。5)遍历两棵树的右节点。返回合并后的二叉树。
2024-09-11 19:40:21 277
原创 leetcode-739. 每日温度
4)当单调栈的数组不为空,且当前的数值持续比栈顶元素数值大,就将单调栈的栈顶元素pop出来,并记录结果到result里,3)从第一个温度数组里遍历,如果当前数值小于等于单调栈里的栈顶元素,将当前数据push到result数组里。天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用。PS:栈保存索引,对比大小是temperatures里的数值。2)单调栈里面保存的是温度数组的索引,初始化为0。,表示每天的温度,返回一个数组。1)初始化结果数组,全都为0。
2024-09-09 19:55:55 325
原创 leetcode-543. 二叉树的直径
无非在求最大深度的代码中,加入了一个求直径的过程。直径等于左子树深度+右子树深度+1,每次和预先设置好的最大值进行比对。PS:最后返回的是self.res-1,因为我们记录的一直都是节点的个数,直径等于节点个数-1,求边的个数。3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。这条路径可能经过也可能不经过根节点。是指树中任意两个节点之间最长路径的。给你一棵二叉树的根节点,返回该树的。这道题,很容易可以做出本题。由它们之间边数表示。
2024-08-20 20:28:06 251
原创 leetcode-538. 把二叉搜索树转换为累加树
树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点。2)之后先更新这个变量,self.res += root.val。3)更新根节点的值:root.val = self.res。4)其他的只要先遍历右子树,再遍历左子树就行。1)需要设置一个记录全局累加的变量。的新值等于原树中大于或等于。唯一困难的地方:中间的两行代码。反序中序遍历,使用递归。
2024-08-20 19:56:46 436
原创 leetcode-494. 目标和
2)之后就和分割等和子集一样的遍历方法【先遍历物品,再遍历背包】出现1就看dp[4]的方法有多少种。1)首先计算出,正数的总和是多少【作为背包的总重量】(sum(nums)+target)// 2。输入:nums = [1,1,1,1,1], target = 3。输入:nums = [1], target = 1。解释:一共有 5 种方法让最终目标和为 3。返回可以通过上述方法构造的、运算结果等于。,然后串联起所有整数,可以构造一个。向数组中的每个整数前添加。PS:初始化dp[0]=1。
2024-08-20 14:29:22 294
原创 leetcode-461. 汉明距离
指的是这两个数字对应二进制位不同的位置的数目。异或运算,返回count('1')的数量即可。上面的箭头指出了对应二进制位不同的位置。,计算并返回它们之间的汉明距离。输入:x = 1, y = 4。输入:x = 3, y = 1。
2024-08-18 22:25:43 397
原创 leetcode-448. 找到所有数组中消失的数字
2)再次遍历数组,看哪个索引对应的数值还是大于等于0的,说明他在上一轮中没有出现过。返回索引+1,即为未出现的数。PS:其中,两处的abs(num)必须加,这不是取绝对值。不加的话,for循环输出的num是:数字的存储地址。1)遍历数组,把数字-1的索引对应的数字,取相反数【变成负数】输入:nums = [4,3,2,7,8,2,3,1]中的数字,并以数组的形式返回结果。输入:nums = [1,1]
2024-08-18 22:16:12 292
原创 leetcode-438. 找到字符串中所有字母异位词
3)后面使用滑动窗口的方式,前一个去掉,后一个加上,去校验当前s窗口和p,是否所包含字母的出现次数一致。起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。输入: s = "abab", p = "ab"
2024-08-18 21:31:39 318
原创 leetcode-37. 路径总和 III
不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。和等于 8 的路径有 3 条,如图所示。,求该二叉树里节点值之和等于。给定一个二叉树的根节点。
2024-08-18 18:23:27 279
原创 leetcode-416. 分割等和子集
因为:数组中的元素都是正整数,如果是奇数的话,除以2,是两个小数的和了。4)dp数组遍历顺序,如果使用一维dp数组,外层循环遍历物品,内层循环遍历背包,且需从大到小遍历背包,已防重复。2)题目中找到子集的和是sum(nums)//2,即为存在等和自己的。3)初始化:如果题目给的价值都是正整数那么非0下标都初始化为0就可以了,如果题目给的价值有负数,那么非0下标就要初始化为负无穷。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。解释:数组可以分割成 [1, 5, 5] 和 [11]。
2024-08-18 17:48:35 279
原创 leetcode-406. 根据身高重建队列
因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]输入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]输出:[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]2)遍历排好序的数组,按照k值的索引进行插入即可。
2024-08-16 17:18:00 311
原创 leetcode-394. 字符串解码
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数。给定一个经过编码的字符串,返回它解码后的字符串。输入:s = "2[abc]3[cd]ef"输入:s = "abc3[cd]xyz"输出:"abcabccdcdcdef"输入:s = "3[a]2[bc]"输入:s = "3[a2[c]]"输出:"abccdcdcdxyz"输出:"accaccacc",表示其中方括号内部的。输出:"aaabcbc"
2024-08-14 14:15:24 188
原创 leetcode-347. 前 K 个高频元素
3)否则,比较进来元素的次数如果大于堆顶的频率的话,就先将刚进来的元素放进去,之后pop栈顶元素(heapq.heappushpop:先放进,再pop)2)用小根堆,如果当前小根堆保留长度小于k个,刚进来的元素直接放进去就可以。输入: nums = [1,1,1,2,2,3], k = 2。输入: nums = [1], k = 1。1)先用字典保存每个数出现的次数。,请你返回其中出现频率前。
2024-08-11 23:49:29 159
原创 leetcode-338. 比特位计数
动态规划,分为奇数和偶数处理。奇数比前面的偶数多一个1;偶数和除以2对应的偶数一样多。输出:[0,1,1,2,1,2],计算其二进制表示中 1。输出:[0,1,1]
2024-08-11 19:11:26 189
原创 leetcode-337. 打家劫舍 III
之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。动态规划,后序遍历【使用一个长度为2的数组,记录当前节点偷与不偷所得到的的最大金钱】小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为。小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7。小偷一晚能够盗取的最高金额 4 + 5 = 9。,小偷能够盗取的最高金额。
2024-08-11 18:54:44 193
原创 leetcode-309. 买卖股票的最佳时机含冷冻期
设计一个算法计算出最大利润。解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。dp数组是2维,一共4个状态,根据4个状态去写对应的转换公式。输入: prices = [1,2,3,0,2],这里写的很详细【确定好4个状态】输入: prices = [1]最后取状态2,3,4中最大的返回。
2024-08-11 17:46:49 253
原创 leetcode-300. 最长递增子序列
是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。解释:最长递增子序列是 [2,3,7,101],因此长度为 4。动态规划,虽然不是背包问题,但做完完全平方数,感觉会好做一点这题。输入:nums = [10,9,2,5,3,7,101,18]公式:dp[i] = max(dp[i], dp[j]+1)输入:nums = [7,7,7,7,7,7,7]输入:nums = [0,1,0,3,2,3],找到其中最长严格递增子序列的长度。
2024-08-11 17:13:55 163
原创 leetcode-287. 寻找重复数
这个视频讲解的很好,也叫抽屉原理。有4个笼子放5只鸽子,至少有一个笼子里放2只鸽子。输入:nums = [1,3,4,2,2]输入:nums = [3,1,3,4,2]输入:nums = [3,3,3,3,3]),可知至少存在一个重复的整数。你设计的解决方案必须。
2024-08-11 16:41:33 330
原创 leetcode-283. 移动零
ps:左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。2)fast不断向后移动,遇到0就加1;否则和slow指针的元素互换。移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。输入: nums = [0,1,0,3,12]1)初始化slow,fast两个指针。输出: [1,3,12,0,0]输入: nums = [0],编写一个函数将所有。
2024-08-11 15:32:34 154
原创 leetcode-279. 完全平方数
是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。动态规划公式:dp[i] = min(dp[i], dp[i-j*j]+1)背包问题,先遍历背包,再遍历物品。解释:12 = 4 + 4 + 4。解释:13 = 4 + 9。的完全平方数的最少数量。
2024-08-11 15:04:33 233
原创 leetcode-253.会议室II
最小堆minHeap,先按start排序,然后维护一个minHeap,堆顶元素是会议结束时间最早的区间,也就是end最小。每次比较top元素的end时间和当前元素的start时间,如果start>=end,说明该上一个room可以结束接下来被当前会议区间使用。最后返回堆的大小就是所需的房间数。
2024-08-07 09:52:27 228
原创 leetcode-240. 搜索二维矩阵 II
2)如果等于target,就返回true。3)如果大于target,就col-=1。4)如果小于target,就row+=1。1)从第一行,最后一列开始遍历。编写一个高效的算法来搜索。
2024-08-07 00:13:11 290
原创 leetcode-238. 除自身以外数组的乘积
3)计算 ans[i] 的 上三角 各元素的乘积,记为 tmp ,并乘入 ans[i]。1)初始化:数组 ans ,其中 ans[0]=1;辅助变量 tmp=1。2)计算 ans[i] 的 下三角 各元素的乘积,直接乘入 ans[i]。根据表格的主对角线(全为 1 ),可将表格分为。分别迭代计算下三角和上三角两部分的乘积。之中任意元素的全部前缀元素和后缀的乘积都在。之外其余各元素的乘积。时间复杂度内完成此题。4)返回 ans。
2024-08-06 23:47:49 214
原创 leetcode-236. 二叉树的最近公共祖先
中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1。输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4。4)如果left为空,right不为空,就返回right,说明目标节点是通过right返回的,反之依然。因为根据定义最近公共祖先节点可以为节点本身。
2024-08-06 20:36:58 160
原创 leetcode-234. 回文链表
ps:反转链表的时候,pre初始值设置成None,设置成-1会有问题,None利于3)的循环。3)比对两个链表,如果值不一样,则返回false。1)慢指针走一步,快指针走两步,找到中间结点。2)从中间结点开始进行反转链表。给你一个单链表的头节点。,请你判断该链表是否为。
2024-08-06 17:16:47 306
原创 leetcode-226. 翻转二叉树
1)前序遍历,先进行交换左右孩子节点,然后反转左子树,反转右子树。,翻转这棵二叉树,并返回其根节点。给你一棵二叉树的根节点。
2024-08-06 14:39:33 206
原创 leetcode-221. 最大正方形
1)如果该位置的值是 1,则 dp(i,j) 的值由其上方、左方和左上方的三个相邻位置的 dp 值决定。2)如果 i 和 j 中至少有一个为 0,则以位置 (i,j) 为右下角的最大正方形的边长只能是 1,因此 dp(i,j)=1。组成的二维矩阵内,找到只包含。的最大正方形,并返回其面积。
2024-08-06 14:16:33 117
原创 leetcode-215. 数组中的第K个最大元素
3)如果len(nums)-len(small)<k:说明k在small数组里,递归small数组,但k的值需替换为:k-[len(nums)-len(small)],需要去掉在big数组里的前几个,k需要更新下,更新到在small数组里的位置。1)先遍历数组,把比当前值小的值,放在small数组里;大的值,放在big里;等于的放在equal里。2)如果big数组的长度大于k,说明k在big里,递归big数组进行查找k。请注意,你需要找的是数组排序后的第。个最大的元素,而不是第。
2024-08-05 21:01:03 198
原创 leetcode-207. 课程表
学习课程 1 之前,你需要先完成课程 0;并且学习课程 0 之前,你还应先完成课程 1。1)定义一个入度数组,用来存储 prerequisites[1]这些节点的入度个数。学习课程 1 之前,你需要完成课程 0。4)弹出队首节点,count+=1,查邻接表看后面要学的课程。在选修某些课程之前需要一些先修课程。请你判断是否可能完成所有课程的学习?5)在入度数组中纷纷减去1,因为前面的课程学完了。3)定义一个队列,先把入度为0的放入队列中。6)如果有课程入度为0,则放入队列。,表示如果要学习课程。
2024-07-31 15:27:08 182
原创 leetcode-200. 岛屿数量
因为避免了 没有意义的递归调用,在调用dfs之前,就做合法性判断。这里大家应该能看出区别了,无疑就是版本一中 调用dfs 的条件判断 放在了 版本二 的 终止条件位置上。是:不管节点是否合法,上来就dfs,然后在终止条件的地方进行判断,不合法再return。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。是 :下一个节点是否能合法已经判断完了,传进dfs函数的就是合法节点。(水)组成的的二维网格,请你计算网格中岛屿的数量。很多同学看了同一道题目,都是dfs,写法却不一样,
2024-07-28 13:10:51 249
原创 leetcode-198. 打家劫舍
如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。然后dp[i]取最大值,即dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])偷窃到的最高金额 = 2 + 9 + 1 = 12。
2024-07-28 12:16:28 228
原创 leetcode-169. 多数元素
2)再从第一个元素开始遍历,如果下一个元素与前一个元素值相同,则count+=1,否则count-=1。3)当count==0时,令当前数为新的num,再重新让count=1。4)遍历到最后,输出num(如果它大于数组长度的一半),否则输出0。你可以假设数组是非空的,并且给定的数组总是存在多数元素。,返回其中的多数元素。多数元素是指在数组中出现次数。1)数组中第0个元素为num,个数count设为1。
2024-07-28 11:23:40 289
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人