自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

JXH_123的专栏

共同学习,共同进步,资源共享

  • 博客(422)
  • 资源 (1)
  • 收藏
  • 关注

原创 ms-hot目录

131. 长度为n的开心字符串中字典序第k小的字符串。126. 每个元音包含偶数次的最长子字符串。159. 得到连续K个1的最小相邻交换次数。190. 应用操作后不同二进制字符串的数量。38. 填充每个节点的下一个右侧结点指针。205. 使数组中所有元素相等的最小开销。208. 统计X和Y频数相等的子矩阵数量。138. 删除链表M个节点后的N个节点。167. 使数组元素相等的减少操作次数。177. 分享K个糖果后独特口味的数量。填充每个节点的下一个右侧结点指针II。104. 将数组分成和相等的三个部分。

2024-11-20 23:21:47 425

原创 leetcode-HOT目录

66. 在排序数组中查找元素的第一个和最后一个位置。68. 寻找旋转排序数组中的最小值。29. 删除链表的倒数第N个节点。44. 二叉搜索树中第K小的元素。69. 寻找两个正序数组的中位数。75. 数组中的第K个最大元素。8. 无重复字符串的最长子串。16. 除自身以外数组的乘积。30. 两两交换链表中的节点。32. 复制带随机指针的链表。49. 二叉树的最近公共祖先。50. 二叉树中的最大路径和。57. 电话号码的字母组合。78. 买卖股票的最佳时机。17. 缺失的第一个正数。21. 搜索二维矩阵II。

2023-06-17 11:51:28 671

原创 ms-hot59 岛屿数量

采用图宽度遍历的方法,将二维数组中grid[i][j]为1的值放入队列中,并将邻居值[(i-1,j),(i+1,j), (i, j-1),(i,j+1)]等于1的节点放入队列中进行扩展,形成一个值为1的“团”,并将该团的值改成2,最后统计团的个数即可。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。(水)组成的的二维网格,请你计算网格中岛屿的数量。此外,你可以假设该网格的四条边均被水包围。

2024-12-16 08:11:29 302

原创 ms-hot58 位1的个数

第1次循环: num=num & (num - 1) = 1101 & (1101-1)=1101 & 1100= 1100--> count = 1。每次将num对应的二进制的最右侧的1通过按位与运算变成0,用一个count记录消0的次数即可。第2次循环: num=num & (num - 1) = 1100&(1100-1)=1100&1011=1000-->count=2。第3次循环:num=num & (num - 1) = 1000&(1000-1)=1000&0111=0-->count=3。

2024-12-15 16:58:47 281

原创 ms-hot57 轮转数组

向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100]第三步:翻转后n-k个字符串nums[k, n)第一步:翻转整个字符串nums[0~ n);第二步:翻转前k个字符串nums[0~k);翻转如下,注意开闭区间。,将数组中的元素向右轮转。

2024-12-15 16:46:03 174

原创 ms-hot56 反转字符串中的单词 II

i. 找单词的开始和结束位置:根据单词间的空格,找到每个单词的开始位置word_start和结束位置的下一个位置(空格作为标志)。ii. 最后一个单词的结束位置需要特殊处理:最后一个单词的结束位置(单词的长度作为标志)。的定义为:单词是一个由非空格字符组成的序列。解题方法:整个字符串反转 + 每个单词反转。iii. 对每一个单词反转。解法来解决此问题,即不分配额外的空间。中的单词将会由单个空格分隔。第一步:对整个字符串反转。第二步:对每一个单词反转。

2024-12-15 16:33:48 377

原创 ms-hot55 地下城游戏

3. 状态转移方程:dp[i][j] = max(min(dp[i+1][j], dp[i][j+1])-nums[i][j], 1)1. 问题定义:dp[i][j]表示从nums[i][j]到右下角节点nums[rnum-1][cnum-1]的最低初始健康点数;任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。骑士的初始健康点数为一个正整数。如果骑士遵循最佳路径:右 -> 右 -> 下 -> 下 ,则骑士的初始健康点数至少为 7。

2024-12-15 16:03:03 415

原创 ms-hot54 二叉搜索树迭代器

注意,指针初始化为一个不存在于 BST 中的数字,所以对。// 返回 True。// 返回 True。// 返回 True。时,BST 的中序遍历中至少存在一个下一个数字。

2024-12-15 15:53:06 746

原创 ms-hot53 EXCE表列序号

从左向右遍历,str[0~i-1]为num1, 第i个数字为num2=str[i]-'A'+1。截止到遍历i的时候,算到num=num1*26+num2。:mode % 26范围为[0, 26] ==> mod % 26 + 1 大小范围为[1, 26]。,表示 Excel 表格中的列名称。该列名称对应的列序号。

2024-12-15 15:44:37 414

原创 ms-hot52 EXCE表列名称

我们想想十进制数字的提取方法:base=10, num=123,最右边的数字为123%10=3[这里余数的范围是0~9];base=26,余数的范围是[A~Z 对应1~26],所以拿到数字前先要将余数的范围缩小为[0~25],即数字num-1。解题方法:从右向左生成数字(num-1) % 26,再将生成的数组映射到字母中。数字i映射到A~Z。,返回它在 Excel 表中相对应的列名称。

2024-12-15 15:12:06 219

原创 ms-hot51 寻找峰值

找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回。峰值元素是指其值严格大于左右相邻值的元素。或者返回索引 5, 其峰值元素为 6。3 是峰值元素,你的函数应该返回其索引 2。你的函数可以返回索引 1,其峰值元素为 2;你必须实现时间复杂度为。的算法来解决此问题。

2024-12-15 14:39:10 167

原创 ms-hot50 比较版本号

1. 字符串转换为整数核心函数: num = 10*num + s[i] - '0'。你的函数可以返回索引 1,其峰值元素为 2;或者返回索引 5, 其峰值元素为 6。3. 考虑数字大小越界的可能,用long long保存提取结果。2. 如果有一个字符已经遍历完了,则将其比较的值设置为0。,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回。:遍历两个字符串,分别提取两个字符串.号分割的数字,并比较大小。峰值元素是指其值严格大于左右相邻值的元素。3 是峰值元素,你的函数应该返回其索引 2。

2024-12-15 12:45:49 393

原创 ms-hot49 相交链表

的输入如下(你设计的程序。

2024-12-15 12:35:40 815

原创 ms-hot48 寻找旋转排序数组中的最小值

1)如果nums[mid]小于nums[right],此时最小值为mid或者在mid左边,应该缩小求解区间,将right设置为mid;2)如果nums[mid]大于或等于nums[right],说明当前mid在左段的升序空间,此时最小值一定在mid的右边;请你找出并返回数组中的。原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。的数组,预先按照升序排列,经由。

2024-12-15 12:28:15 315

原创 ms-hot47 反转字符串中的单词

第3步:单词翻转:用一个下标i遍历[s.begin, s.end),用两个变量[word_start, word_end], word_end指向当前单词结束的下一个位置(中间的字符串word_end为空,尾部字符串word_end为s最后一个字符的下一个位置),。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。第1步:用双指针法去掉输入字符s的首尾空字符串,用处理后的字符串覆盖s。

2024-12-15 11:44:04 277

原创 ms-hot46 LRU缓存

1.当前put的中的key如果已经在map中,则只需要将list中的挪到list的首部,同时更新map中该key对应的value。(2)从list的首部插入[更新list],同时将更新到map中[更新map]。lst.splice(lst.begin(), lst, iter)表示将lst的iter对应的元素移到list的头部。(1)将该key对应的list中的节点从当前查询的位置挪到list的头部。

2024-12-15 11:24:10 886

原创 ms-hot45 环形链表

用过两个指针,其中一个指针每次走1步,另外一个指针每次走2步,如果存在环,两个指针必然在某一时刻相遇;如果不存在环,快指针必然优先走到链表的末尾。指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。来表示链表尾连接到链表中的位置(索引从 0 开始)。如果链表中有某个节点,可以通过连续跟踪。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。给你一个链表的头节点。仅仅是为了标识链表的实际情况。,判断链表中是否有环。

2024-12-15 11:19:38 263

原创 ms-hot44 单词拆分 II

1. 从i开始做选择,用j=[i, n),如果s[i, j]存在于dictSet中,则将s[i, j]追加到path中,当path的长度为n的时候,将path追加到result中。问题定义:backtrack(s, i, result, path, dictSet)表示对s[i]做选择,也就是说s[0~i-1]已经做过选择。下一步: backtrack(s, j + 1, result, path, dictSet)中增加空格来构建一个句子,使得句子中所有的单词都在词典中。注意你可以重复使用字典中的单词。

2024-12-15 11:15:46 273

原创 ms-hot43 随机链表的复制

1. 按照单链表的方式遍历旧链表中每一个节点,并生存一张新链表,用map保存旧链表的每一个节点到新链表的每一个节点的映射。指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。2. 同时遍历新、旧链表中的每一个节点,根据生成的map,更新新链表对应的random指针。节点组成,其中每个新节点的值都设为其对应的原节点的值。个节点组成的链表来表示输入/输出中的链表。的链表,每个节点包含一个额外增加的随机指针。,该指针可以指向链表中的任何节点或空节点。返回复制链表的头节点。

2024-12-10 23:54:09 596

原创 ms-hot42 验证回文串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个。1. 归一化字符串:遍历输入字符串s,将大写转小写、提取有效字符串到归一化后的字符串。"amanaplanacanalpanama" 是回文串。在移除非字母数字字符之后,s 是一个空字符串 ""。2. 利用双指针判断归一化后的字符串是否为回文串。字母和数字都属于字母数字字符。由于空字符串正着反着读都一样,所以是回文串。"raceacar" 不是回文串。:归一化字符串 + 双指针判断。

2024-12-10 23:45:33 305

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

被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42。:凡是涉及到二叉树路径相关的最大、最长、最多的题,都可以采用二叉树"三步曲"最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6。3. 用一个全局变量(函数引用传递)聚合遍历过程中的计算值。是路径中各节点值的总和。2. 利用二叉树遍历的方法获取每一个节点的计算值。1. 先求根节点作为起始的计算值。节点,且不一定经过根节点。

2024-12-10 23:37:51 387

原创 ms-hot39 填充每个节点的下一个右侧结点指针II

给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。的主要区别:上一题用了一个队列来保存下一层待遍历的节点,即o(n)的空间复杂度。2. 用一个dummy_node作为下一层的虚拟头节点,这样下一层生成链表时可以省去对头指针的判断逻辑。4. 遍历完p0对应的本层节点后,将p0指向dummy_node的下一个节点,开始遍历下一层节点。1. 用两个指针p0和p1分别指向当前遍历层的节点和下一层待遍历的节点。

2024-12-10 23:34:31 271

原创 ms-hot40 买卖股票的最佳时机

一次遍历数组,保存从数组开始到当前元素num[i]的最小值min_value,并计算max(num[i]-min_value),遍历完数组后,所求解到的最大值即为最大利润。在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回。设计一个算法来计算你所能获取的最大利润。

2024-12-10 23:34:00 238

原创 ms-hot38 填充每个节点的下一个右侧结点指针

2.遍历每一层节点:弹出队首节点n0,将当前节点n的next指针指向新的队首节点n1,并将n0的next指向n1,并将n0的左右孩子压入栈中。这里需要注意的是:这个操作不能对每一层的最后一个节点生效,因为最后一个节点的next指针为NULL,当遍历到当前层的最后一个节点时,队列q的头节点为下一层的第一个节点,这里容易出错。1. 从root节点开始,依次遍历每一层的节点,在遍历每一层的第一个节点前,需要先记录下队列q的大小,即为当前层的节点数。,其所有叶子节点都在同一层,每个父节点都有两个子节点。

2024-12-09 23:14:08 381

原创 ms-hot37 二叉树展开为链表

假如root节点的left, right节点非空,则二叉树找到链接的两个断点,断点1-root的right节点,断点2-root->left子树的最右侧节点,假设为right_most。断点1的链接位置是:root->right=root->left;断点2的链接位置是:right_most->right = 原root->right。方法1: 利用先序遍历的非递归算法,在遍历前用一个pre指针指向上一次访问的节点,然后一边访问一边更改pre的right节点。额外空间)展开这棵树吗?你可以使用原地算法(

2024-12-08 23:17:27 416

原创 ms-hot36 路径总和

第三步:按上述方法递归遍历左右孩子,递归遍历左右孩子时target-root->value作为新的target。第二步:如果root节点的值等于target,且左右孩子为空,则返回true。第一步:判断root是否为空,为空则直径返回false。不存在 sum = 5 的根节点到叶子节点的路径。由于树是空的,所以不存在根节点到叶子节点的路径。的路径,这条路径上所有节点值相加等于目标和。等于目标和的根节点到叶节点路径如上图所示。(1 --> 2): 和为 3。和一个表示目标和的整数。是指没有子节点的节点。

2024-12-08 23:01:34 335

原创 ms-hot35 从中序与后序遍历序列构造二叉树

第二步:由于树中各个节点的值不同,可以用一个map保存中序遍历中的映射,这样通过后序遍历找到root节点的value后,可以通过map找到中序遍历中做左子树团和右子树团。中序遍历:(左子树团)root (右子树团)。第三步:确认root节点和左子树团和右子树团后,递归生成左子树和右子树。第一步:通过后序遍历可以确定root节点为后序遍历的最后一个节点。中序遍历:左-中-右 ,后序遍历:左-右-中。是同一棵树的后序遍历,请你构造并返回这颗。是二叉树的中序遍历,

2024-12-07 21:22:19 385

原创 ms-hot33 二叉树的层序遍历

用队列q保存下一层的结点,在每一层未开始遍历时,队列q的大小表示下一层结点的个数。这里需要回顾下c++队列的常用函数。C++队列的头文件:,常用函数跟栈很像,只是栈top()表示栈顶元素,而queue的fron()表示队首元素。(即逐层地,从左到右访问所有节点)。

2024-12-04 23:41:07 415

原创 ms-hot32 对称二叉树

用类似二叉树先序遍历的方法。先判断两颗树是否为对称二叉树 isSymmetric(TreeNode* root1, TreeNode* root2) ,两颗子树为对称子树的条件是然后将root1改成root->left, root2改成root->right调用该函数即可。你可以运用递归和迭代两种方法解决这个问题吗?给你一个二叉树的根节点。, 检查它是否轴对称。

2024-12-04 23:36:43 337

原创 ms-hot31 验证二叉搜索树

利用二叉搜索树先序遍历的方法,用pre保存root的前驱动指针,pre节点的值必然小于于root节点的值(因为这里是二叉搜索树)。根节点的值是 5 ,但是右子节点的值是 4。给你一个二叉树的根节点。,判断其是否是一个有效的二叉搜索树。

2024-12-04 23:31:44 318

原创 ms-hot30 二叉树的中序遍历

用一个stack依次将root的一层层的left节点压入栈中,所有的left节点压入栈后,栈顶元素则为当前最左侧的节点,则访问该节点,访问完后将该节点的right节点压入栈中,并重复上述过程直到栈顶为空。给定一个二叉树的根节点。

2024-12-02 23:22:39 321

原创 ms-hot27 单词搜索

用backtrack(board, x, y, word, i, visited)表示是否存在以board[x][y]为开始节点,能找到单词word,为了防止重复兜圈查找,用visited变量保存标记当前已经访问的位置。1)visited[x][y]=true,比较board[x][y]是否等于word[i],不相等直接返回false;2) 如果board[x][y]等于word[i],则继续向上、下、左、右四个方向继续搜索word[i+1];4)visited[x][y]=false 恢复状态。

2024-12-02 23:18:36 683

原创 ms-hot26 颜色分类

2. 若num为2,(p2, n)必然都为2,但是(i, p2]之间的数字是不确定的,所以这里不能更新i,即原来p2指向的数字可能为2,如果更新i则会直接跳过这个数字。此时只更新p2,p2--。p2:从右向左,指向第一个非2的位置(p2右边必然是2,但是p2本身可能指向2)。1.若num为0, [p0, num)必然都为1,则同时更新p0和i,p0++, i++。对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。分别表示红色、白色和蓝色。3. 若num为1,则只更新i,i++。

2024-12-02 23:14:59 289

原创 ms-hot25 矩阵置零

用两个一维数组保存对应的行或者对应列是否为0,先遍历数组中的元素matrix[i][j],如果matrix[i][j]等于0,则将对应的行标记数组rows_has_zero[i]和列标记数组cols_has_zero[j]设置为true,表示对应的行或者列中的元素应该设置为0。再用这两个数组去更新原数组即可。(这里有一个优化的点,可以用两个变量分别保存第1行或第1列是否存在0,然后第1行和第1列的元素去取代两个一维数组的工作,最后用两个变量还原第1行和第一列的值)的矩阵,如果一个元素为。

2024-12-02 23:10:41 380

原创 ​ms-hot23 合并区间

区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。区间 [1,4] 和 [4,5] 可被视为重叠区间。表示若干个区间的集合,其中单个区间为。: 区间排序 + 相邻区间边界分类考虑。请你合并所有重叠的区间,并返回。

2024-12-02 23:05:12 322

原创 ms-hot22 跳跃游戏

遍历数组,保存当前能遍历到的最大跳跃位置(从0开始), max_pos=max(max_pos, i + nums[i]),如果遍历过程中存在max_pos 大于等于n-1的情况,则说明可以到达最后一个位置。无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。给定一个非负整数数组。

2024-12-02 23:01:19 291

原创 ms-hot21 螺旋矩阵

按照右->下->左->上的方向,依次遍历数组中没有遍历过的元素,每遍历完一个方向,就将对应的边界缩小。用一个变量total_num来记录当前还有多少元素没有遍历,每遍历一个元素,total_num的值减1,直到所有的元素都被遍历过即可。,返回矩阵中的所有元素。

2024-12-02 22:57:48 319

原创 ms-hot20 最大子数组和

动态规划思想,每次相加前判断之前遍历过的连续子数组的当前和是否小于0,若小于则丢弃从头开始累加。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。连续子数组 [4,-1,2,1] 的和最大,为 6。是数组中的一个连续部分。

2024-12-01 23:19:11 308

原创 ms-hot19 旋转图像

再主对角线翻转(即ij位置互换): a[n - 1 - i][j]=> a[j][n - 1 - i]先上下翻转: a[i][j] => a[n - 1 - i][j]所以,a[i][j]翻转后的位置变为a[j][n - 1 - i]旋转图像,这意味着你需要直接修改输入的二维矩阵。请你将图像顺时针旋转 90 度。: 先上下对称翻转,再主对角线翻转。使用另一个矩阵来旋转图像。

2024-12-01 23:15:04 423

原创 ms-hot18 全排列II

给定一个可包含重复数字的序列nums返回所有不重复的全排列。[[1,1,2],[1,2,1],[2,1,1]]:回溯法 + set去重。1. 定义函数backtrack(nums, i, result)表示开始对nums[i]找对应的可能值,核心步骤:对nums[i], ..., nums[n-1]中的每一个元素都尝试下赋值和撤销对步骤。

2024-12-01 23:11:02 262

空空如也

空空如也

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

TA关注的人

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