自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 贪心4 划分字母区间

【代码】贪心4 划分字母区间。

2025-02-25 09:42:03 244

原创 贪心3 跳跃游戏 II

【代码】贪心3 跳跃游戏 II。

2025-02-25 09:28:45 257

原创 贪心2 跳跃游戏

的格子都尝试跳一次,把。

2025-02-25 08:30:44 220

原创 贪心1 买卖股票的最佳时机

用一个变量记录一个历史最低价格 minprice,我们就可以假设自己的股票是在那天买的。那么我们在第 i 天卖出股票能得到的利润就是 prices[i] - minprice。每次都假设是今天卖出,然后求今天之前的历史最低点。

2025-02-24 19:03:59 191

原创 堆3 数据流的中位数

当累计添加的数的数量为奇数时,queMin 中的数的数量比 queMax 多一个,此时中位数为 queMin 的队头。当累计添加的数的数量为偶数时,两个优先队列中的数的数量相同,此时中位数为它们的队头的平均值。我们把有序集合看作自动排序的数组,使用双指针指向有序集合中的中位数元素即可。当累计添加的数的数量为奇数时,双指针指向同一个元素。当累计添加的数的数量为偶数时,双指针分别指向构成中位数的两个数。两个优先队列 queMax 和 queMin 分别记录大于中位数的数和小于等于中位数的数。

2025-02-24 18:53:04 331

原创 347. 前 K 个高频元素

【代码】347. 前 K 个高频元素。

2025-01-25 11:09:48 423

原创 215. 数组中的第K个最大元素

【代码】215. 数组中的第K个最大元素。

2025-01-25 11:04:34 210

原创 739.每日温度

【代码】739.每日温度。

2025-01-23 11:19:34 209

原创 394. 字符串解码

【代码】394. 字符串解码。

2025-01-23 09:56:50 241

原创 155. 最小栈

辅助栈leetcode题解

2025-01-22 09:52:20 181

原创 20. 有效的括号

遍历给定的字符串 s。当我们遇到一个左括号时,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此我们可以将这个左括号放入栈顶。

2025-01-22 09:49:37 191

原创 4. 寻找两个正序数组的中位数

leetcode题解

2025-01-22 09:46:09 190

原创 153. 寻找旋转排序数组中的最小值

【代码】153. 寻找旋转排序数组中的最小值。

2025-01-22 09:39:46 168

原创 33. 搜索旋转排序数组

【代码】33. 搜索旋转排序数组。

2025-01-22 09:35:28 242

原创 34. 在排序数组中查找元素的第一个和最后一个位置

【代码】34. 在排序数组中查找元素的第一个和最后一个位置。

2025-01-22 09:28:01 245

原创 74. 搜索二维矩阵

【代码】74. 搜索二维矩阵。

2025-01-22 09:23:47 402

原创 35. 搜索插入位置

在一个有序数组中找第一个大于等于 target 的下标。

2025-01-22 09:20:22 163

原创 51. N 皇后

【代码】51.N皇后。

2025-01-20 10:34:26 279

原创 131.分割回文串

【代码】131.分割回文串。

2025-01-19 09:22:52 231

原创 79. 单词搜索

返回false:(1)行或列索引越界或(2)当前矩阵元素与目标字符不同或(3)当前矩阵元素已访问过((3)可合并至(2))。递归参数:当前元素在矩阵board中的行列索引i和j,当前目标字符在word中的索引k。返回true:k=len(word)-1,即字符串word已全部匹配。

2025-01-19 07:56:09 287

原创 22.括号生成

任何一个括号序列都一定是由 ‘(’ 开头,并且第一个 ‘(’ 一定有一个唯一与之对应的 ‘)’。生成所有 2^2n 个 ‘(’ 和 ‘)’ 字符构成的序列,然后我们检查每一个是否有效,长度为 n 的序列就是在长度为 n−1 的序列前加一个 ‘(’ 或 ‘)’。那么,要生成所有长度为 2n 的括号序列,我们定义一个函数 generate(n) 来返回所有可能的括号序列。如果在遍历过程中 balance 的值小于零,或者结束时 balance 的值不为零,那么该序列就是无效的,否则它是有效的。

2025-01-17 09:11:26 347

原创 39.组合总数

定义递归函数 dfs(target,combine,idx) 表示当前在 candidates 数组的第 idx 位,还剩 target 要组合,已经组合的列表为 combine。那么在当前的函数中,每次我们可以选择跳过不用第 idx 个数,即执行 dfs(target,combine,idx+1)。也可以选择使用第 idx 个数,即执行 dfs(target−candidates[idx],combine,idx),注意到每个数字可以被无限制重复选取,因此搜索的下标仍为 idx。

2025-01-12 20:15:59 167

原创 电话号码的字母组合

回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是不完整的)。每次取电话号码的一位数字,从哈希表中获得该数字对应的所有可能的字母,并将其中的一个字母插入到已有的字母排列后面,然后继续处理电话号码的后一位数字,直到处理完电话号码中的所有数字,即得到一个完整的字母排列。然后进行回退操作,遍历其余的字母排列。

2025-01-12 19:00:54 237

原创 78. 子集

在进入 dfs(cur,n) 之前 [0,cur−1] 位置的状态是确定的,而 [cur,n−1] 内位置的状态是不确定的,dfs(cur,n) 需要确定 cur 位置的状态,然后求解子问题 dfs(cur+1,n)。对于 cur 位置,我们需要考虑 a[cur] 取或者不取,如果取,我们需要把 a[cur] 放入一个临时的答案数组中(即上面代码中的 t),再执行 dfs(cur+1,n),执行结束后需要对 t 进行回溯;如果不取,则直接执行 dfs(cur+1,n)。(还介绍了一种二进制做法,很巧妙)

2025-01-12 12:16:11 281

原创 46. 全排列

终止条件: 当 x = len(nums) - 1 时,代表所有位已固定(最后一位只有 1 种情况),则将当前组合 nums 转化为数组并加入 res ,并返回。递推工作: 将第 x 位元素与 i ∈ [x, len(nums)] 元素分别交换,并进入下层递归。固定元素: 将元素 nums[i] 和 nums[x] 交换,即固定 nums[i] 为当前位元素。还原交换: 将元素 nums[i] 和 nums[x] 交换(还原之前的交换)。递推参数: 当前固定位 x。

2025-01-12 11:33:47 233

原创 207.课程表

【代码】207.课程表。

2025-01-11 19:39:09 259

原创 实现 Trie (前缀树)

中保存了对当前结点而言下一个可能出现的所有字符的链接,因此我们可以通过一个父结点来预知它所有子结点的值。

2025-01-11 19:00:20 233

原创 腐烂的橘子

上下左右相邻的新鲜橘子就是该腐烂橘子尝试访问的同一层的节点,路径长度就是新鲜橘子被腐烂的时间。

2025-01-11 15:58:04 222

原创 200.岛屿数量

网格结构可看作四叉树。

2025-01-11 11:44:19 242

原创 二叉树中的最大路径和

对于二叉树中的一个节点,该节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值,如果子节点的最大贡献值为正,则计入该节点的最大路径和,否则不计入该节点的最大路径和。维护一个全局变量 maxSum 存储最大路径和,在递归过程中更新 maxSum 的值,最后得到的 maxSum 的值即为二叉树中的最大路径和。

2025-01-09 11:12:15 380

原创 二叉树的最近公共祖先

2.当 left 和 right 同时不为空 :说明 p,q 分列在 root 的 异侧 (分别在 左 / 右子树),因此 root 为最近公共祖先,返回 root;3.当 left 为空 ,right 不为空 :p,q 都不在 root 的左子树中,直接返回 right。1.当 left 和 right 同时为空 :说明 root 的左 / 右子树中都不包含 p,q ,返回 null;1.p 和 q 在 root 的子树中,且分列 root 的 异侧(即分别在左、右子树中);

2025-01-09 10:30:54 255

原创 路径总和III

利用先序遍历二叉树,记录下根节点 root 到当前节点 p 的路径上除当前节点以外所有节点的前缀和,在已保存的路径前缀和中查找是否存在前缀和刚好等于当前节点到根节点的前缀和 curr 减去 targetSum。访问每一个节点 node,检测以 node 为起始节点且向下延深的路径有多少种。我们递归遍历每一个节点的所有可能的路径,然后将这些路径数目加起来即为返回结果。

2025-01-09 10:19:52 249

原创 从前序与中序遍历序列构造二叉树

只要我们在中序遍历中定位到根节点,那么我们就可以分别知道左子树和右子树中的节点数目。由于同一颗子树的前序遍历和中序遍历的长度显然是相同的,因此我们就可以对应到前序遍历的结果中,对上述形式中的所有左右括号进行定位。这样以来,我们就知道了左子树的前序遍历和中序遍历结果,以及右子树的前序遍历和中序遍历结果。即根节点总是前序遍历中的第一个节点。而中序遍历的形式总是。对于任意一颗树而言,前序遍历的形式总是。

2025-01-08 22:50:29 343

原创 二叉树展开为链表

【代码】二叉树展开为链表。

2025-01-08 16:55:09 402

原创 二叉树的右视图

对二叉树进行层次遍历,那么对于每层来说,最右边的结点一定是最后被遍历到的,即取每一层的最后一个元素。二叉树的层次遍历可以用广度优先搜索实现。对树进行深度优先搜索,在搜索过程中,我们总是先访问右子树。那么对于每一层来说,我们在这层见到的第一个结点一定是最右边的结点。

2025-01-08 10:50:23 175

原创 二叉搜索树中第 K 小的元素

如果 node 的左子树的结点数 left 小于 k−1,则第 k 小的元素一定在 node 的右子树中,令 node 等于其的右子结点,k 等于 k−left−1,并继续搜索;如果 node 的左子树的结点数 left 大于 k−1,则第 k 小的元素一定在 node 的左子树中,令 node 等于其左子结点,并继续搜索。如果 node 的左子树的结点数 left 等于 k−1,则第 k 小的元素即为 node ,结束搜索并返回 node 即可;需要频繁地查找第 k 小的值的情况,优化算法。

2025-01-08 10:41:15 418

原创 108. 将有序数组转换为二叉搜索树

可以选择中间数字作为二叉搜索树的根节点,这样分给左右子树的数字个数相同或只相差1,可以使得树保持平衡。如果数组长度是奇数,则根节点的选择是唯一的,如果数组长度是偶数,则可以选择中间位置左边的数字作为根节点或者选择中间位置右边的数字作为根节点,选择。对于整个中序遍历序列,下标范围从left=0到right=nums.length−1。在给定中序遍历序列数组的情况下,每一个子树中的数字在数组中一定是连续的,因此可以通过。不同的数字作为根节点则创建的平衡二叉搜索树也是不同。

2025-01-08 10:23:57 248

原创 98. 验证二叉搜索树

二叉搜索树性质:如果该二叉树的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;它的左右子树也为二叉搜索树。设计一个递归函数helper(root,lower,upper)来递归判断,函数表示考虑以root为根的子树,判断子树中所有节点的值是否都在(l,r)的范围内(注意是开区间)。

2025-01-08 09:39:41 436

原创 二叉树的直径

递归思路:任意一条路径均可以被看作由某个节点为起点,从其左儿子和右儿子向下遍历的路径拼接得到。

2025-01-06 23:04:25 218

原创 二叉树的层序遍历

层序遍历要求的输入结果和 BFS 略有不同,层序遍历要求我们区分每一层,也就是返回一个二维数组。

2025-01-06 12:14:34 269

空空如也

空空如也

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

TA关注的人

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