热题100
文章平均质量分 59
Leetcode热题100收录题目
Noric!
这个作者很懒,什么都没留下…
展开
-
128 最长连续序列
最理想的情况是同样的序列仅遍历一次,一次遍历完所有序列中的元素,可以通过从序列的起点开始遍历解决。这样问题就变为如何识别序列的起点,这就很简单了,对于当前元素。数据结构,对数组元素去重,进一步优化运行时间。,那么若已知序列起点,目标值递增向后遍历,借助哈希表检查目标值是否存在,可以在。但是若从数组每一个元素开始,遍历查找序列,时间复杂度还是会达到。需要考虑到数组中可能存在重复元素,可以通过借助。是否在数组中,即可判断。原创 2024-08-29 23:22:46 · 184 阅读 · 0 评论 -
49 字母异位词分组
可以借助Map,来存储排列不同的异位词。Key为字母的升序排列,Value为不同异位词的数组。题目要求将字母异位词组合在一起,那么需要用一种方式,来该概括不同异位词。这些异位词的共性就是。,那么就可以使用一种统一的排列方式将其概括,比如升序排序。注意:字符串在C++中与数组或其他数据结构一样,可以用。原创 2024-08-23 00:01:27 · 228 阅读 · 0 评论 -
136 只出现一次的数字
这道题正是利用了自反性的特点,由于只有一个元素出现一次,其余全部出现两次,只要将他们全部异或,出现两次的元素异或结果为0,而剩下目标元素与0的异或结果为其本身。这道题目明确要求了时间复杂度为O(N),空间复杂度为O(1),不然借助哈希表很容易能够在O(N)的空间复杂度下解决。特殊的要求只能特殊处理,解这道题只能记住。异或是对二进制数进行位运算,相同为0,相异为1(这种较特殊的运算方式。原创 2024-08-18 15:38:51 · 300 阅读 · 0 评论 -
70 爬楼梯
但空间复杂度可以进一步优化。观察计算公式,其实并不需要记录每个。看做一个二进制数表示(如1101),每一位都有一个“基数” =的值,后面的数只要不断查表并将其相加就可以了。快速幂可以用在一些齐次线性递推式中,形如。凑出如上形式,但其实不太常用,了解就好了。的数位对应的“基数”相乘,就可以得到。的值就足够了,这样空间复杂度达到了。如果不满足齐次线性递推式,可以构建。我们可以通过列表的方法记录每个。,这样将时间复杂度可以达到。解题思路一:(动态规划)解题思路二:(快速幂),只要将二进制表示中为。原创 2024-08-18 00:45:38 · 701 阅读 · 0 评论 -
121 买卖股票的最佳时机
由于是从前向后逐个遍历,很容易可以记录之前股票价格的最小值,遍历完成后将最大差值输出即可。,提交后会超时,所以需要在此基础上进行优化,能否通过一次遍历找出最大利润。这个题如果把每一种买卖的可能都算出来的解法时间复杂度在。,卖出股票所能得到的最大利润 = 当前股票价格 -天股票价格的最小值。原创 2024-08-15 00:03:28 · 177 阅读 · 0 评论 -
543 二叉树的直径
说明:如果有多个转折点,那么路径上会产生分支,该路径不为合法路径;若没有转折点,可将末尾节点的另外一个子节点加入路径,该路径不是最长的;每一条最长路径中一定存在一个转折点 + 若干非转折点(见说明),只需要把每一个点看做转折点,然后开始构建最长路径,从这些路径长度中选取最大值,即为树的直径。那么,如何构建最长的路径呢,很简单,可以通过递归来解决,在递归之中每一步,情况一:该节点为非转折点,最长路径经过其。作为非转折点能构建的最长的路径长度。情况二:该节点为转折点,最长路径经过其。为转折点构建的路径长度。原创 2024-08-13 22:15:49 · 394 阅读 · 0 评论 -
20 有效的括号
则检查栈顶元素是否与之匹配,匹配则将其出栈,否则返回字符串无效。最后检查栈是否为空,为空时字符串有效。本题最难的点是想到用栈来解决。想到栈以后,事情就变得简单了。将左右括号做一个快速映射,代码看起来更精简些。代码部分可以改进的点,在于可以借助。)将其压入栈中,若为右括号(原创 2024-08-10 15:48:57 · 221 阅读 · 0 评论 -
35 搜索插入位置
由于本题中,有序数组中无重复元素,且如果没找到此元素时,返回要插入的位置,可以使用模版一来解决。与目标值的比较结果,更新下一次搜索区间(左半边或右半边),直至区间大小为1。二分其实是有模版的,而且有两种:一种是从左向右找到第一个。内,题目存在一中特殊情况,即所有元素小于。初始化为[0, N-1]。的位置,即该位置左边的所有元素均小于。二分基本思路是,通过锚定一个中间值。),另一种是从右向左找到第一个。,可知此题用二分查找解决。,把搜索区间一分为二,根据。有一点需要注意:由于。原创 2024-08-08 00:44:48 · 918 阅读 · 0 评论 -
108 将有序数组转换为二叉搜索树
由平衡可知左右子树的节点数量近似相等,相差不应超过一。建树的时候,从数组的最中间选择作为根节点,有序数组的左边组成左子树,数据右边组成右子树,直至完成几个。原创 2024-08-06 00:20:35 · 232 阅读 · 0 评论 -
101 对称二叉树
迭代可以使用BFS,同时存两个子树的节点,并将其相邻排列,比较队列中相邻两个节点是否值相同。左子树和右子树之间是轴对称的,这两部分可以通过左右翻转相互转化。使用两个指针,同时遍历左右子树,并比较左右节点的值,在寻找下一个节点时,进行翻转即可。解这道题的关键在于,如何理解轴对称的二叉树。原创 2024-08-03 13:27:33 · 282 阅读 · 0 评论 -
94 二叉树的中序遍历
利用栈,对二叉树进行深度优先搜索,按照“左 — 中 — 右”的方式输出。中序遍历的起始点为该树最左边的非空元素。本题可以使用递归、DFS(迭代)解决。重复的基础操作:输出。左边的所有节点,输出。原创 2024-08-01 00:09:00 · 196 阅读 · 0 评论 -
226翻转二叉树
树相关的题,大部分都可以通过递归来解决。因为树结构(尤其是二叉树)天然地具有递归发展的性质:对于二叉树的每个树节点,都有一个左节点和一个右节点,且能无限重复延伸。所以对于使用递归方法解题,最重要的是需要确定,对每个节点,不断重复的基础操作是什么。对于本题,翻转二叉树来说,将每个节点的。,可完成翻转,即使子节点为。也没关系,无需特殊处理。原创 2024-07-31 22:46:31 · 236 阅读 · 0 评论 -
104 二叉树的最大深度
STL时间复杂度总结 https://blog.csdn.net/2302_79440616/article/details/139326935。对于每个节点,将左子树的最大深度与右子树的最大深度比较,选取较大值+1,即为当前节点树的最大深度。空节点的最大深度为0.从根节点开始,每次将同深度的节点加入队列,再遍历队列节点,将其左右子节点加入队列。DFS:一般用 递归 or 迭代+栈。再次回顾C++STL 队列数据结构queue的用法。BFS:一般用 迭代+队列。最大深度可以想到使用。(广度优先)来解决。原创 2024-07-30 23:52:04 · 328 阅读 · 0 评论 -
141 环形链表
存在环的条件下,如何证明两指针一定会享相遇呢?最容易想到的方法,就是遍历链表同时用哈希表。但能不能更进一步优化空间复杂度到。如果链表不存在环,则。为所有自然数,所以一定能够到达。遇到重复节点则认为存在环,返回。这种方法简单直接,时间复杂度。会在环中绕圈,直到某一时刻与。,则链表中不存在环,返回。- 为链表中环的长度。借用双指针的思路,用。每次前进1步,快指针。原创 2023-12-12 22:29:24 · 118 阅读 · 0 评论 -
234 回文链表
由于链表的结构特点,访问链表中的元素的时间复杂度为O(n)。相比较而言,使用数组会方便很多,实现O(1)访问。所以这个题,可以先遍历一遍把数值存到数组中,再使用双指针判断是否是回文。原创 2023-12-05 22:22:57 · 157 阅读 · 0 评论 -
206 反转链表
用于重复将当前节点添加到链表末尾,被函数各层调用使用,一开始的思路是,是用全局变量去存储链表末尾,并在每次操作后不断更新。:通过函数调用其自身,完成目标。另外需要注意的点,由于每次操作是重复的,如果仅仅改变指针的指向会导致反转后的链表未能指向。现在,函数递归到节点2,如何找到翻转链表的末尾?思路大致相同,但是能否优化无需使用全局变量来存储链表末尾?,用于题目输出,只能作为递归函数的返回值传递。,因此在每一步操作中,需额外将反转链表末尾指向。2)目标拆解后,函数每一步需要。,作为翻转后链表的表头。原创 2023-12-04 21:54:49 · 143 阅读 · 0 评论 -
160 相交链表
相交,则它们之间的区别就仅在于相交节点之前的部分(其实任意两个链表最终都会相交,最坏相交于NULL节点)。这个思路虽然可行,但略显繁琐。对于不同的情况需要分类讨论,因而导致代码写起来非常复杂。如果在相交前,到达了链表末尾,则下一节点将是另一条链表的起始节点。3、较长的链表经过差值处理后,遍历两链表检查是否存在相交点。的距离相等,指针能同时到达。这种交叉遍历的方式,巧妙兼容了。,若两链表不相交,两指针最终一定会同时到达。两个链表,直到它们遇到相交节点(1、找到两个链表较长的那个;,若相交,相交节点到。原创 2023-11-27 22:01:56 · 146 阅读 · 0 评论 -
283 移动零
这个思路虽然可行,但实现代码仍有些繁琐,需要同时移动两个指针,并且考虑两个指针的范围问题。要创造自己一个假设,并在每一步都要做与假设一致的操作,维持假设成立,最后将假设变成“现实”。:假设以其为分界点,左边均为非零元素,右边均为0元素;:不断向右探索的指针,直至遍历到数组最后一个元素停止。右移1,以保证假设成立。若数组中无0元素,在移动过程中。若任意一个指针到达数组末尾时停止。,找到第一个非零元素时交换二者的值;每次仅移动一次指针(很多算法题的解题思路,都与。右边第一个非零元素坐标。始终指向第一个0元素。原创 2023-10-15 22:47:08 · 476 阅读 · 0 评论 -
1 两数之和
map & unordered_map原创 2023-10-15 00:38:47 · 178 阅读 · 0 评论