![](https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
LeetCode Algorithms
力扣上的算法题
幸运征服者
这个作者很懒,什么都没留下…
展开
-
力扣 513. 找树左下角的值
这道题因为需要找到最底层和最左边的值,使用层序遍历会更方便。在标准的层序遍历代码上无需保存每个节点,只需要保存每层最左边的值就可以在最后直接输出。在进行每一层的遍历时,保存最左边的值。最后一次保存的值就是最后一层最左边的值。层序遍历需要使用队列来进行辅助。root,请找出该二叉树的。题目:给定一个二叉树的。时间复杂度:O(n)原创 2023-10-04 14:56:17 · 117 阅读 · 0 评论 -
力扣 145. 二叉树的后序遍历
在迭代法中,前序遍历是中左右,后序遍历是左右中,那么只需要调整一下先序遍历的左右子节点入栈顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是后序遍历的左右中了。确定递归函数的参数和返回值:在递归函数中,因为要存放后序遍历节点的数值,所以参数里需要传入vector的指针或者引用来放节点的数值,不需要返回值,所以递归函数返回类型为void。确定单层递归的逻辑:后序遍历是左右中的循序,所以在递归函数的逻辑中,先取递归取左节点的数值,再递归取右节点的数值,再取中节点的数值。原创 2023-07-26 11:47:06 · 91 阅读 · 0 评论 -
力扣 102. 二叉树的层序遍历
当嵌套循环结束后,将vector中保存的当前层级的所有节点放入vector二维数组中保存。在此循环中,将队列的最前面的节点出队,值被添加到vector中保存,并且该节点被从队列中删除。如果出队的节点有左子节点,则将其放入队列中,在下一个大循环里作为下一层级的节点处理。再构建一个嵌套循环,用于处理当前层级的所有节点,循环终止条件是处理完当前级别的所有节点。构建一个循环,循环终止条件为队列中没有需要处理的节点,即将树中全部节点处理完。原创 2023-07-27 14:56:12 · 45 阅读 · 0 评论 -
力扣 101. 对称二叉树
左右都不为空,节点数值相同,递归比较下一层,即二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子;和内侧是否对称,传入左节点的右孩子,右节点的左孩子。确定递归函数的参数和返回值:因为要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个子树,参数自然也是左子树节点和右子树节点。左节点为空,右节点不为空,不对称,return false。左右都不为空,节点数值不相同,return false。左不为空,右为空,不对称,return false。原创 2023-07-28 03:06:37 · 35 阅读 · 0 评论 -
力扣 226. 翻转二叉树
题解采用前序遍历迭代法和层序遍历,但还有多种方法可以使用。确定递归函数的参数和返回值:参数就是要传入节点的指针,题目要求返回root节点的指针,所以直接利用题目定义好的函数作为递归函数。确定单层递归的逻辑:因为是前序遍历,所以先进行左右子节点交换,然后递归反转左子树和反转右子树。层数遍历也可以翻转这棵树,因为层序遍历可以在遍历每个节点的时候将左右孩子都翻转一遍。前序遍历迭代法时间复杂度:O(n),空间复杂度:O(n)层序遍历时间复杂度:O(n),空间复杂度:O(n)原创 2023-07-28 01:58:47 · 36 阅读 · 0 评论 -
力扣 257. 二叉树的所有路径
该题需要返回从根节点到所有叶子节点的路径,那么在遍历过程中,当到达叶子节点后,就需要使用回溯进行下一个节点的遍历。遍历使用前序遍历,前序遍历顺序为 中,左,右,这样在路径中就可以先加入当前的中节点,再递归遍历左右节点。在递归过程中,首先将当前节点的值加入到 path 中,表示当前节点在遍历路径中。如果是叶子节点,将 path 中的节点值按照路径格式拼接成一个字符串,然后将该字符串加入到 result 中。题目:给你一个二叉树的根节点 root,按任意顺序,返回所有从根节点到叶子节点的路径。原创 2023-10-03 11:24:30 · 27 阅读 · 0 评论 -
力扣 107. 二叉树的层序遍历 II
该题要求返回其节点值自底向上的层序遍历,即从叶子节点所在层到根节点所在的层,逐层从左向右遍历。当嵌套循环结束后,将vector中保存的当前层级的所有节点放入vector二维数组中保存。在此循环中,将队列的最前面的节点出队,值被添加到vector中保存,并且该节点被从队列中删除。如果出队的节点有左子节点,则将其放入队列中,在下一个大循环里作为下一层级的节点处理。再构建一个嵌套循环,用于处理当前层级的所有节点,循环终止条件是处理完当前级别的所有节点。原创 2023-07-27 15:13:32 · 38 阅读 · 0 评论 -
力扣 404. 左叶子之和
该题主要在于判断该节点是否为父节点的左子节点同时也是叶子节点,所以在遍历节点的时候,就直接判断该节点的左子节点是否为叶子节点。遍历采用后序遍历,顺序为 左,右,中。采用后序遍历可以先判断左子节点是否为叶子节点,如果不是进行递归到下一层再判断,然后再遍历右子节点,判断右子节点的左子节点是否为叶子节点。如果左子节点存在,再检查左子节点是否为叶子节点。直到到达叶子节点,不一定是左叶子节点。检查当前节点的右子节点存在,如果存在,递归遍历右子树的左右节点。如果是叶子节点,将左子节点的值累加到 sum 中。原创 2023-10-03 12:36:56 · 29 阅读 · 0 评论 -
力扣 239. 滑动窗口最大值
单调队列的实现:单调队列是一种特殊的数据结构,它的特点是队列中的元素始终保持单调性。在本题中,我们需要维护一个从大到小的单调队列,这样队列的第一个元素始终是滑动窗口中的最大值。主要思想为队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。滑动窗口的维护:在每次窗口滑动时,移除最前面的元素,同时添加一个新的元素。push(value):若队列不为空,从后往前弹出比value小的元素,然后将value压入队列,因为该队列只维护最大值。原创 2023-04-24 02:56:53 · 81 阅读 · 0 评论 -
力扣 116. 填充每个节点的下一个右侧节点指针、力扣 117. 填充每个节点的下一个右侧节点指针 II
在此循环中,如果当前处理节点是该层最后一个节点,则next指针指向NULL。否则,指向队列中的下一个front节点,即该节点的右侧节点。如果当前处理节点有左子节点,则将其放入队列中,在下一个大循环里作为下一层级的节点处理。再构建一个嵌套循环,用于处理当前层级的所有节点,循环终止条件是处理完当前级别的所有节点。构建一个循环,循环终止条件为队列中没有需要处理的节点,即将树中全部节点处理完。创建一个队列,如果不为空树,则将根节点(第一个节点)入队。时间复杂度:O(n),空间复杂度:O(n)原创 2023-07-27 21:28:24 · 61 阅读 · 0 评论 -
力扣 199. 二叉树的右视图
在此循环中,将队列的最前面的节点出队,判断是否为该层最后一个节点,如果是则将值添加到vector中保存,然后将节点从队列中删除。如果出队的节点有左子节点,则将其放入队列中,在下一个大循环里作为下一层级的节点处理。再构建一个嵌套循环,用于处理当前层级的所有节点,循环终止条件是处理完当前级别的所有节点。构建一个循环,循环终止条件为队列中没有需要处理的节点,即将树中全部节点处理完。创建一个队列,如果不为空树,则将根节点(第一个节点)入队。时间复杂度:O(n),空间复杂度:O(n)原创 2023-07-27 16:39:38 · 76 阅读 · 0 评论 -
力扣 144. 二叉树的前序遍历
而迭代与普通循环的区别是,迭代的循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。确定递归函数的参数和返回值:在递归函数中,因为要存放前序遍历节点的数值,所以参数里需要传入vector的指针或者引用来放节点的数值,不需要返回值,所以递归函数返回类型为void。确定单层递归的逻辑:前序遍历是中左右的循序,所以在递归函数的逻辑中,先取中节点的数值,再递归取左节点的数值,再递归取右节点的数值。确定终止条件:在递归函数中,如果当前遍历的这个节点是个空节点,则直接return。原创 2023-07-26 11:20:03 · 80 阅读 · 0 评论 -
力扣 94. 二叉树的中序遍历
此时,我们从堆栈中弹出一个节点,该节点代表当前要处理的节点(当前子树中最左边的节点)。栈中下一次循环中弹出的节点就是2.1中一直向左移动时遇到的节点中的中节点,这表示中序遍历中的“中间”步骤。确定递归函数的参数和返回值:在递归函数中,因为要存放中序遍历节点的数值,所以参数里需要传入vector的指针或者引用来放节点的数值,不需要返回值,所以递归函数返回类型为void。确定单层递归的逻辑:中序遍历是左中右的循序,所以在递归函数的逻辑中,先取递归取左节点的数值,再取中节点的数值,再递归取右节点的数值。原创 2023-07-26 11:56:39 · 98 阅读 · 0 评论 -
力扣 104. 二叉树的最大深度
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。这道题求的是二叉树的最大深度,也就是二叉树的层数。构建一个循环,循环终止条件为队列中没有需要处理的节点,即将树中全部节点处理完。如果当前处理节点有左子节点,则将其放入队列中,在下一个大循环里作为下一层级的节点处理。再构建一个嵌套循环,用于处理当前层级的所有节点,循环终止条件是处理完当前级别的所有节点。创建一个队列,如果不为空树,则将根节点(第一个节点)入队。时间复杂度:O(n),空间复杂度:O(n)大循环结束,返回层数depth。原创 2023-07-28 00:58:00 · 33 阅读 · 0 评论 -
力扣 515. 在每个树行中找最大值
注意最大值largest的初始化可以使用该层的第一个值,也可以使用INT_MIN。遍历该层剩余节点时,就与最大值比较,留下更大值作为最大值。如果出队的节点有左子节点,则将其放入队列中,在下一个大循环里作为下一层级的节点处理。再构建一个嵌套循环,用于处理当前层级的所有节点,循环终止条件是处理完当前级别的所有节点。构建一个循环,循环终止条件为队列中没有需要处理的节点,即将树中全部节点处理完。创建一个队列,如果不为空树,则将根节点(第一个节点)入队。时间复杂度:O(n),空间复杂度:O(n)原创 2023-07-27 20:07:48 · 37 阅读 · 0 评论 -
力扣 347. 前 K 个高频元素
遍历unordered_map中的元素,将其加入小顶堆。如果优先级队列的size大于了只需要维护的k个元素,则说明当前堆中多余了一个元素,根据小顶堆的特性(父节点小于子节点),因此我们需要将堆顶元素,即频率最低的元素弹出。本题使用了优先级队列(小顶堆)实现了找到给定整数数组中出现频率最高的k个元素。关键点在于使用优先级队列(小顶堆)的理解和维护出现频率最高的k个元素的过程。遍历小顶堆,将堆中的元素加入结果数组result,注意结果数组需要逆序存储。时间复杂度:O(nlogk),空间复杂度:O(n)原创 2023-04-24 04:15:58 · 54 阅读 · 0 评论 -
力扣 110. 平衡二叉树
二叉树的高度是指的当前节点到叶子节点的最长路径,所以当需要计算二叉树高度时,应该使用后序遍历。因为后序遍历顺序为 左 右 中,是先计算左右子节点的高度,再判断左右子树是否平衡一级计算中间节点的高度的。如果是不平衡的二叉树,返回 -1,并在后续的检查中会一直返回 -1。如果是不平衡的二叉树,返回 -1,并在后续的检查中会一直返回 -1。如果当前节点 cur 为空,表示这是一颗空树,返回高度 0。题目:给定一个二叉树,判断它是否是高度平衡的二叉树。时间复杂度:O(n),空间复杂度:O(n)原创 2023-10-03 10:31:45 · 33 阅读 · 0 评论 -
力扣 222. 完全二叉树的节点个数
方法二就是利用完全二叉树中满二叉树的数量公式,先根据深度判断是否是满二叉树,如果是则直接用公式计算节点数量,如果不是满二叉树,向下递归一级,再判断子树是否是满二叉树,以此类推,可以节省直接使用递归的时间复杂度。在完全二叉树中,判断一个左子树或者右子树是不是满二叉树的方法就是如果递归向左遍历的深度等于递归向右遍历的深度,则该树为满二叉树。对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。继续递归遍历右子节点,直到最底部,返回该节点。原创 2023-10-02 20:16:52 · 48 阅读 · 0 评论 -
力扣 637. 二叉树的层平均值
这道题要求求每一层的平均值,那么可以使用层序遍历依次将每一层的值都加起来,除以每一层的节点数量。嵌套循环结束后,将当前层的总和sum除以该层节点数量,得到平均值,将结果放入vector。如果出队的节点有左子节点,则将其放入队列中,在下一个大循环里作为下一层级的节点处理。在此循环中,将队列的最前面的节点出队,将该节点的值加入sum求总和,然后将节点从队列中删除。再构建一个嵌套循环,用于处理当前层级的所有节点,循环终止条件是处理完当前级别的所有节点。时间复杂度:O(n),空间复杂度:O(n)原创 2023-07-27 17:04:32 · 52 阅读 · 0 评论 -
力扣 429. N 叉树的层序遍历
只需要将传统层序遍历中判断当前节点的左右子节点并加入队列的操作改为利用循环加入多个子节点就可以了。当嵌套循环结束后,将vector中保存的当前层级的所有节点放入vector二维数组中保存。在此循环中,将队列的最前面的节点出队,将该节点的值加入sum求总和,然后将节点从队列中删除。再构建一个嵌套循环,用于处理当前层级的所有节点,循环终止条件是处理完当前级别的所有节点。构建一个循环,循环终止条件为队列中没有需要处理的节点,即将树中全部节点处理完。原创 2023-07-27 17:26:07 · 28 阅读 · 0 评论 -
力扣 111. 二叉树的最小深度
这道题求的是二叉树的最小深度,最小深度是从根节点到最近叶子节点的最短路径上的节点数量。可以使用层序遍历记录深度,遍历节点时找没有左右孩子的节点,然后返回最小深度。如果当前处理节点有左子节点,则将其放入队列中,在下一个大循环里作为下一层级的节点处理。如果当前处理节点左右节点都没有,则找到最小深度,返回depth。构建一个循环,循环终止条件为队列中没有需要处理的节点,即将树中全部节点处理完。再构建一个嵌套循环,用于处理当前层级的所有节点,循环终止条件是处理完当前级别的所有节点。大循环结束,返回depth。原创 2023-07-28 01:31:30 · 37 阅读 · 0 评论 -
力扣 541. 反转字符串 II
题意可以理解为反转k个字符,然后跳过k个字符。这道题的关键点在于注意字符串的下标从0开始,而题目中的下标从1开始,并且reverse()函数的区间为左闭右开。对于每次迭代,检查是否有至少k个字符要翻转。如果是,则翻转从当前索引i开始的子字符串的前k个字符。如果剩余的字符数少于k,则反转该子字符串中所有剩余的字符。初始化一个循环,每次迭代都以2*k为步长遍历字符串s。时间复杂度:O(n),空间复杂度:O(1)返回反转后的字符串s。原创 2023-04-13 16:44:17 · 31 阅读 · 0 评论 -
力扣 150. 逆波兰表达式求值
下面代码采取的是首先判断字符数组中字符串长度,如果大于1,说明不只一个数,是十位以上的正数或者负数,不会是运算符。本题使用栈数据结构根据逆波兰表达式计算算术表达式的值,关键点在于如何判断一个字符数组中的各个字符串(含负数)是否为数字,而不是运算符。如果token的长度大于1(负数或者十位以上的正数)或者第一个字符是数字(正数),则将字符串转换成整数并将其压入栈st中。除去这种方法以外,因为运算符的种类是固定的,可以先判断是否是加减乘除运算符,如果不是,则是数字。时间复杂度:O(n),空间复杂度:O(n)原创 2023-04-16 01:08:05 · 43 阅读 · 0 评论 -
力扣 20. 有效的括号
本题使用了栈这种先进后出的数据结构,可以更方便的按有效顺序存储左括号或者对应的右括号,在需要匹配时弹出括号来判断是否匹配。下面代码是遍历时如果是左括号压对应右括号,如果右括号就对栈内的右括号进行匹配的方法。如果栈为空或者栈顶元素不是对应的右括号,说明括号不匹配,直接返回false。如果匹配,则弹出栈顶元素,表示成功匹配。首先判断字符串的长度是否为奇数,如果是,则一定不满足匹配要求,直接返回false。遍历完成后,如果栈为空,则说明括号匹配完成,否则没匹配完。时间复杂度:O(n),空间复杂度:O(n)原创 2023-04-15 17:08:18 · 32 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
本题使用了双指针的方法,关键点在于扩展字符串长度从后向前更新字符串的思想。后序遍历的好处是从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动使得时间复杂度是O(n^2)的问题。从后向前遍历字符串,其中 left 指针指向原字符串的尾部,right 指针指向新字符串的尾部。扩充原始字符串的大小,使其能够容纳所有的空格替换为"%20"之后的字符串。时间复杂度:O(n),空间复杂度:O(1)时间复杂度:O(n),空间复杂度:O(1)原创 2023-04-13 17:45:27 · 24 阅读 · 0 评论 -
力扣 1047. 删除字符串中的所有相邻重复项
本题使用了栈这种先进后出的数据结构来存储字符串,当遇到相邻重复项时弹出前一个字符,以实现删除字符串中的相邻重复字母的功能。最后,更改字符串大小为剩余的栈内元素大小,再将栈内剩余的不相邻重复的字母倒序存入字符串中并返回。如果当前字母和栈顶字母相同,则弹出栈顶字母,即删除操作。如果当前字母和栈顶字母不相同,则将当前字母压入栈中。遍历字符串,如果栈为空,则直接将当前字母压入栈中。时间复杂度:O(n),空间复杂度:O(n)原创 2023-04-15 17:44:11 · 61 阅读 · 0 评论 -
力扣 232. 用栈实现队列
在两个栈里面,stIn用于存储push操作添加的元素,stOut用于存储pop和peek操作弹出的元素。关键点在于理清在pop和peek元素时,如果stOut中没元素,会先将stIn的元素压到stOut中,再从stOut中pop,这样顺序就和队列一致。peek函数返回队列的第一个元素,即stOut栈的栈顶元素,但不会弹出该元素。pop函数返回队列的第一个元素,即stOut栈的栈顶元素,并弹出该元素。如果stOut为空,要先将stIn中的所有元素导入stOut中,以便将元素按照队列的顺序弹出。原创 2023-04-15 04:40:34 · 121 阅读 · 0 评论 -
力扣 18. 四数之和
中层循环遍历 nums 中位于 k 之后的元素 i。对于每个 i,检查是否需要剪枝(即提前结束循环)。时间复杂度:O(n^3),空间复杂度:O(log n),log n 是快速排序使用的栈空间,用于存储递归时的中间变量。对于每个 k,检查是否需要剪枝(即提前结束循环)。将四元组添加到结果向量 result 中,对指针 left 和 right 进行去重处理,并同时收缩双指针。本题使用了双指针法的思想,关键点在于如何使用四个指针找四元组,以及对元素去重的逻辑。内层循环使用双指针来查找满足条件的四元组。原创 2023-04-12 03:41:47 · 33 阅读 · 0 评论 -
力扣 459. 重复的子字符串
本题使用了移动匹配和KMP两种方法:移动匹配的关键点是在寻找是否包含s的过程中,需要将ss的开头和结尾的字符删除,以避免寻找到原本的字符串 s,而不是拼接出来的 s;判断 s + s 拼接的字符串里是否出现一个 s 的的时候,要刨除 s + s 的首字符和尾字符,这样避免在 s+s 中搜索出原来的 s,我们要搜索的是中间拼接出来的s。如果字符串 s 是由重复的子字符串(至少两个子字符串)组成的,那么两个 s 拼接在一起,第一个 s 的后面部分和第二个 s 的前面部分一定会构成一个 s。原创 2023-04-15 01:21:47 · 56 阅读 · 0 评论 -
力扣 454. 四数相加 II
定义一个 unordered_map,用来记录 nums1 和 nums2 数组中元素之和以及出现的次数,遍历 nums1 和 nums2 数组中的所有元素,统计它们的元素之和及其出现的次数,并存储到 map 中。遍历 nums3 和 nums4 数组中的所有元素,计算需要找的值 target = 0 - (val3 + val4) ,如果target在 map 中出现过,则将其出现的次数加到计数器 count 中。时间复杂度:O(n^2),空间复杂度:O(n^2)原创 2023-04-11 17:25:09 · 31 阅读 · 0 评论 -
力扣 383. 赎金信
遍历结束后,若所有 ransomNote 的字符都在 magazine 中出现过,并且出现的次数不超过 magazine 中该字符的出现次数,则返回 true;否则返回 false。若出现,就将 record 数组中对应字符出现的次数减一;若未出现,返回 false。定义一个长度为 26 的 int 类型数组 record,用于记录 magazine 中每个字符出现的次数。遍历 magazine,统计其中每个字符出现的次数,记录到 record 数组中。时间复杂度:O(n),空间复杂度:O(1)原创 2023-04-11 23:08:34 · 48 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串
提升难度:不能申请额外空间,只能在本串上操作。关键点在于想到利用局部翻转+整体翻转的思想。时间复杂度:O(n),空间复杂度:O(1)翻转区间为n到末尾的子串。翻转区间为前n的子串。原创 2023-04-13 22:34:41 · 26 阅读 · 0 评论 -
力扣 151. 反转字符串中的单词
本题使用了双指针对字符串进行去除多余空格,关键点在于弄清楚字符串的翻转、去除多余空格和单词翻转的逻辑,主要难点在于用快慢指针去除多余空格并在相邻单词之间添加空格。将翻转和去除空格的功能封装成两个函数,在去除空格的函数中,使用快慢指针去除多余空格并在相邻单词之间添加空格。在翻转单词时,遍历字符串s,当遇到空格或字符串末尾时,翻转前一个单词,更新下一个单词的开始下标。在主函数中,先调用去除多余空格的函数,然后翻转整个字符串,最后翻转每个单词。时间复杂度:O(n),空间复杂度:O(1)返回翻转后的字符串。原创 2023-04-13 22:05:43 · 192 阅读 · 0 评论 -
力扣 349. 两个数组的交集
遍历第二个数组,如果找到了nums2中的元素在 nums1 中出现,就将它添加到结果集合中。注意:find函数如果找到了就返回迭代器,否则就返回num_set.end(),因此此处的不等于就相当于找到了。创建一个unordered_set来存储结果,再创建一个unordered_set来存放第一个数组,初始化时就将数组传入。本题使用了哈希表(unordered set, 数组)两种数据结构,关键点在于掌握unordered set的特性和set容器的成员方法。时间复杂度:O(n),空间复杂度:O(n)原创 2023-04-10 19:02:59 · 43 阅读 · 0 评论 -
力扣 15. 三数之和
对于每个三元组的第一个元素,使用双指针从左右两端分别开始寻找剩下的两个元素,找到所有满足和为 0 的三元组,并将其加入结果数组中。时间复杂度:O(n^2),空间复杂度:O(log n),log n 是快速排序使用的栈空间,用于存储递归时的中间变量。如果第一个元素大于 0,则说明后续的元素一定都大于 0,不可能组成和为 0 的三元组,直接返回空数组。在双指针移动的过程中,需要对于相邻的相同元素进行去重,避免出现重复的三元组。从数组的第一个元素开始遍历,依次作为三元组中的第一个元素。首先对给定数组进行排序。原创 2023-04-12 02:40:14 · 41 阅读 · 0 评论 -
力扣 225. 用队列实现栈
pop函数首先获取队列que1的大小,然后依次将队列que1的元素导入队列que2中,但是要留下最后一个元素作为返回值。关键点在于理清在pop元素时,主要队列将元素导入到辅助队列或者重新添加到队列尾部来模拟栈的过程。pop函数首先获取队列que的大小,然后依次将队列que的元素重新添加到队列尾部,但是要留下最后一个元素作为返回值返回。top函数直接返回队列que1的末尾元素,即栈的最顶上的元素。top函数直接返回队列que的末尾元素,即栈的最顶上的元素。empty函数直接返回队列que1是否为空即可。原创 2023-04-15 05:16:59 · 58 阅读 · 0 评论 -
力扣 202. 快乐数
使用 while 循环来进行迭代计算,每次迭代会将数字 n 的每一位平方相加得到新的数字 sum。如果 sum 等于 1,则说明输入的数字是快乐数,函数返回 true。如果 sum 不等于 1,代码使用一个 unordered_set 来记录已经出现过的数字,如果出现了重复的数字,则说明数字不是快乐数,函数返回 false。如果未出现重复数字,则将 sum 赋值给 n,并将 sum 重置为 0,继续迭代计算。时间复杂度:O(log n),空间复杂度:O(log n)原创 2023-04-10 21:43:12 · 35 阅读 · 0 评论 -
力扣 1. 两数之和
在 map 中查找是否存在与 target-nums[i] 相等的数字,如果找到了,就返回这两个数的下标(通过 map 的下标运算符实现)。本题使用了哈希表(unordered map)的数据结构,关键点在于掌握map容器的用法。如果没找到匹配的数字,将当前元素 nums[i] 和其下标 i 加入到 map 中。定义一个 unordered_map,用来记录已经遍历过的数字以及其下标。如果 nums 中不存在这样的两个数,则返回一个空的 vector。时间复杂度:O(n),空间复杂度:O(n)原创 2023-04-11 00:16:37 · 32 阅读 · 0 评论 -
力扣 344. 反转字符串
本题使用了双指针法,关键点在于理解反转的原理,利用左右指针交换字符串中的字符位置,从而实现字符串的翻转。字符串翻转的操作是通过异或运算实现的,即将左指针和右指针对应的字符进行异或,交换两个字符的值;最后左指针加 1,右指针减 1,继续循环翻转字符串,直到左右指针相遇或者左指针大于右指针。然后通过 while 循环,当左指针小于右指针时,进行字符串翻转;时间复杂度:O(n),空间复杂度:O(1)首先定义左右两个指针指向字符串的首尾字符;原创 2023-04-13 16:18:13 · 178 阅读 · 0 评论 -
力扣 28. 找出字符串中第一个匹配项的下标
本题关键点在于构建 next 跳转表,难点在于在getNext 和 strStr 函数中理清 while 不匹配时的逻辑,不匹配的代码需要放在 if 匹配的代码前面,这样在不匹配回退到下标0时还可以对文本串当前的字符和模式串最开始的字符进行匹配,不然会导致如果文本串当前是匹配的,却因为下标++匹配掉了。当 s[i] 和 s[j] 相等时,将 j 加1,表示匹配成功的子字符串长度,同时将 j 值赋给 next[i],记录在该位置上前缀和后缀匹配的长度,同时也是在遇到冲突时,在这种前缀情况下应该返回的位置。原创 2023-04-14 17:52:12 · 183 阅读 · 0 评论