leetcode 热题100
leetcode 热题100
续亮~
哦
展开
-
76、堆-数据流的中位数
最大堆和最小堆的堆顶元素可以视为中位数或中位数的候选值,因为这两个元素正好将整个数据集分为两个等长的部分,或者其中一个部分多一个元素(当数据总数是奇数时)。整体上,这个设计利用了最大堆和最小堆各自的性质,以及它们在维护中位数方面的互补性,从而提供了一个既高效又简洁的解决方案。当数据总数为奇数时,中位数是元素多的那个堆的堆顶元素。如果两个堆的大小不等,这意味着元素总数是奇数,我们返回元素较多的那个堆的堆顶元素作为中位数。如果两个堆的大小相等,这意味着元素总数是偶数,我们返回两个堆顶元素的平均值作为中位数。原创 2024-05-01 10:42:19 · 27 阅读 · 0 评论 -
75、堆-前K个高频元素
这道题还是使用优先队列,是要大根堆,然后创建一个类,成员变量值和次数。大根堆基于次数排序。前k个就拿出前k的类的值即可。原创 2024-04-30 22:49:04 · 53 阅读 · 0 评论 -
74、堆-数组中的第K个最大元素
直接排序是可以的,但是时间复杂度不符合。原创 2024-04-30 22:45:36 · 94 阅读 · 0 评论 -
73、栈-柱状图中最大的矩形
就是在宽度中最矮的元素。如何确定宽度,就是要确定左右边界。矩形面积:宽度*高度。原创 2024-04-30 22:36:49 · 327 阅读 · 0 评论 -
72、栈-每日温度
第一种方法,双循环,第一层循环拿出一个元素,第二层循环寻找最近比当前大的元素位置。第二种方法:使用栈来实现。原创 2024-04-29 23:21:41 · 139 阅读 · 0 评论 -
71、栈-字符串解码
由上面两个例子可以看出,当遇到[的时候可以先不结算,当遇到 ]的时候结算,结算左侧最近的右括号[。这个也是使用栈的思想。可以使用两个栈一个用于存储字符的栈 () 和一个用于存储重复次数的栈 (原创 2024-04-29 23:07:37 · 74 阅读 · 0 评论 -
70、栈-最小栈
除了最后一个获取最小值以外,其他都可以使用一个栈来实现,但是如果当前一个最小值被移除了,如果获取第二小的值,这个是需要记录的。所以最好的办法是两个栈。一个作为主栈存放数据,一个作为辅栈,存放最小值。原创 2024-04-29 22:40:31 · 195 阅读 · 0 评论 -
69、栈-有效的括号
比如:({)} 这个就是错误的,({}) 这个就是正确的。所以每一个做括号,必有一个对应的右括号,并且需要顺序正确。这里有({ 时候如果第三个是右括号,必须是} 不然就是错误的。找出规则就是先进后出。有效的括号序列是指每个开括号都有一个对应的闭括号,并且括号的配对顺序正确。原创 2024-04-28 23:52:23 · 182 阅读 · 0 评论 -
67、二分-寻找两个正序数组的中位数
第二种方式:改成求第k小的数。那么中位数就是第mid小的数。这个求第K小的数据就可以使用二分的方式。2、只要排序到新数组长度的一半就可以得到中位数。因为我们不需要有序的数组,所以新建一个数组来记录。第一种方式双指针,只要排序一半数组的就行,那么就找到中位数。两个指针谁小移动谁。1、两个都是有序数组,那么中位数就是合并成一个新的有序数组的中位数。原创 2024-04-28 23:41:23 · 154 阅读 · 0 评论 -
67、二分-寻找旋转排序数组中的最小值
不管旋转多少次,在旋转点两侧都是有序的,其中旋转点就是最小值。所以只要找到旋转值就是目标值。可以通过二分方式寻找。从0-N-1上寻找。如果L的值小于R的值说从L到R上递增,那么L就是旋转点。反之就求出mid=L+(R-L)/2 目的防止整数溢出。如果L到mid是递减的,那么旋转点就是在右侧,继续递归寻找。原创 2024-04-28 23:18:53 · 142 阅读 · 0 评论 -
66、二分-搜索旋转排序数组
不断二分,首先判断左侧有序还是右侧有序,如果左侧有序那么就在左侧寻找,如果右侧有序那就在右侧寻找。假设左侧有序,那就判断目标值在不在左侧,如果在左侧继续左侧二分。如果不在左侧,那么在右侧继续二分再去寻找。突出点不断二分,然后在有序部分寻找。有序部分没找到,那就在二分再在有序部分寻找。原创 2024-04-27 22:05:59 · 305 阅读 · 0 评论 -
65、二分-在排序数组中查找元素的第一个和最后一个位置
第一种方式直接线性遍历,找到目标值记录当前下标。继续寻找下一个不等于目标值,说明下一个目标值的下标就是结尾。第二种方式通过使用二分法寻找,先二分寻找寻找第一个目标值,如果存在再继续寻找最后一个目标值。寻找数组中的目标值第一个和最后一个,如果不存在哪儿就是返回-1。原创 2024-04-27 21:22:06 · 131 阅读 · 0 评论 -
64、二分-搜索二维矩阵
通过使用二分方式,对于每行进行二分,因为每行的最后一个数小于下一行的第一个数,我们就可以依次二分。首先取出行数N,然后从0-N进行二分,如果mid最后一个数小于目标值说明0-mid中没有,舍弃,从mid+1到N-1行进行寻找。然后在进行二分直到找到或者便利完为止。原创 2024-04-27 20:21:38 · 239 阅读 · 0 评论 -
63、二分-搜索插入的位置
去中位数,不断二分。如果目标值小于等于L1说在左边直接返回 ,如果等于r1直接返回r1。如果目标值小于等于L2但是大于R1,直接返回L2。如果等于大于等于R2直接返回R2。剩下的部分看落在哪个区间,继续递归。原创 2024-04-26 23:47:00 · 137 阅读 · 0 评论 -
62、回溯-N皇后
N皇后问题要求在一个n×n的棋盘上放置n个皇后,使得它们不能相互攻击。皇后可以攻击同一行、同一列,以及两个对角线方向上的其他皇后。解决这个问题意味着找到所有可能的棋盘配置,每个配置都符合上述条件。原创 2024-04-26 23:30:03 · 857 阅读 · 0 评论 -
61、回溯-分割回文串
还是全排列的思路,列出每一种组合,然后验证是否是回文,如果是子串放入path中,在验证其他元素是否也是回文。原创 2024-04-26 23:13:10 · 327 阅读 · 0 评论 -
60、回溯-单词搜索
这个是找到一种即可返回。那么可以双重便利,以任意一个位置i,j为起始点判断,开始上下左右遍历组成,每获取一个字符就匹配一次,匹配后的字符加个标记,下次不再匹配,相等则进行下一个元素获取。原创 2024-04-26 00:10:53 · 187 阅读 · 0 评论 -
59、回溯-括号生成
括号是成对出现,首先左括号可以放n个,右括号也可以放n个。如果当前左括号放了3了,右括号放了4个,错了,如果左括号放了5个,右括号放了4个。可以,继续放右括号即可。2、当前左括号还剩下多少个可以放 >0 可以继续放左括号。1、当前左括号-右括号>0?原创 2024-04-26 00:02:43 · 242 阅读 · 0 评论 -
58、回溯-组合总和
数组内的每一个元素都可以无线使用只要最后可以拼接成target就可以。(target-已经拼接的和 )/当前元素 就是你可以利用的数量。这里使用的双端队列,目的就是为了方便还原现场。原创 2024-04-25 23:47:11 · 197 阅读 · 0 评论 -
57、回溯-电话号码的字母组合
对于每个键都有对应的字符集合,所以会有很多种匹配,假设现在有两位数23 对于2来说他有三种,对于3来说 他也有三种方式那就一共就是有9中组合。如何实现呢,排列,假设一一列出来。原创 2024-04-25 23:39:07 · 227 阅读 · 0 评论 -
56、回溯-子集
对于当前值来说,我可以不要,也可以要,两种方式,下一个也是,一直到index==length为止,收集完一种排列。还有最重要,收集用的list一定要还原。子集很好理解,当然也要包括空和本身。其他的就是当前数组的一部分元素了。原创 2024-04-25 23:33:29 · 102 阅读 · 0 评论 -
55、回溯-全排列
首先数组内每个元素不重复,所以对于当前位置如果选择某一个位置,那么在之后该元素就不能参与排序。原创 2024-04-25 23:28:14 · 134 阅读 · 0 评论 -
54、图论-实现Trie前缀树
主要是构建一个trie前缀树结构。1、next节点数组。原创 2024-04-22 23:43:35 · 618 阅读 · 0 评论 -
53、图论-课程表
遍历结束后,从入度为0的开始遍历。引文只有入度为0的节点没有先决条件。直到所有节点入度都为0.然后记录下来count和需要学习课程数相比如果相等表示可以。其实就是图的拓扑排序,我们可以构建一个图形结构,比如[0,1]表示1->0,对于0来说入度为+1。原创 2024-04-22 23:37:33 · 435 阅读 · 0 评论 -
52、图论-腐烂的橘子
第一步先找出所有腐烂的橘子,这些橘子会在上下左右进行感染,然后记录被感染的 橘子,之前感染过的句子不再使用,将新的感染的橘子收集,然后遍历让其上下左右依次感染,没做一次批量感染,时间加1。直到无法在搜集新的感染橘子的时候,判断感染橘子的总和和橘子的数量是否相等,如果相等返回最小分钟数,如果不相等,说明有些橘子无法被感染,返回-1。原创 2024-04-22 23:20:46 · 448 阅读 · 0 评论 -
51、图论-岛屿数量
这个解决方案通过DFS(深度优先搜索)来识别和计数所有的岛屿。每当找到一个未被访问的陆地单元格,就通过递归“感染”过程标记所有与之相连的陆地单元格,防止它们在后续的遍历中被重复计数。这种方法简单高效地解决了岛屿计数问题。return 0;i < N;return res;原创 2024-04-21 22:23:05 · 700 阅读 · 0 评论 -
50、二叉树-二叉树中最大的路径和
分别考虑每个节点作为路径中的转折点时可能的最大路径和,同时保证递归过程中更新全局最大值。通过递归地计算每个节点的最大单边贡献,并在每次递归中尝试更新包括该节点的全局最大路径和,这种方式确保了能够找到整棵树的最大路径和。原创 2024-04-21 18:51:37 · 482 阅读 · 0 评论 -
49、二叉树-二叉树的最近公共祖先
整个过程是一个自顶向下的搜索,然后利用递归的自底向上的特性,将找到的信息返回到上一层。这种方法主要是基于二叉树的后序遍历框架来实现的,即对于每个节点,先处理其所有子节点后再处理该节点。: 最终,递归的初始调用(从根节点开始的调用)将返回整个搜索的结果,即。递归深入每一个节点,尝试在该节点的左右子树中找到目标节点。这一步骤可以视为在树中向下深入,直到触及终止条件。: 对当前节点的左右子树进行递归调用,搜索。中的任何一个时,停止递归,返回当前节点。: 当到达叶子节点的子节点(即。原创 2024-04-21 18:37:02 · 306 阅读 · 0 评论 -
48、二叉树-路径总和III
1、从根节点出发有多少种方案。2、从左节点出发有多少种方案。3、从右节点出发有多少种方案。原创 2024-04-20 20:18:53 · 214 阅读 · 0 评论 -
47、二叉树-从前序与中序遍历序列构造二叉树
前序:头 左 右后序:左 头 右遍历。原创 2024-04-20 19:53:59 · 177 阅读 · 0 评论 -
46、二叉树-二叉树展开为链表
1、使用先序遍历每个节点 放入集合中,然后遍历集合,左子树为null,右子树为下一个节点。原创 2024-04-20 11:57:02 · 137 阅读 · 0 评论 -
45、二叉树-二叉树的右视图
【代码】45、二叉树-二叉树的右视图。原创 2024-04-19 23:35:36 · 323 阅读 · 0 评论 -
44、二叉树-二叉搜索树中第K小的元素
中序遍历 天然的从左到头再到右,升序。所以不用排序直接拿集合第k-1个数即可。原理同上,只是不用集合了,用常量计数。原创 2024-04-19 23:27:22 · 279 阅读 · 0 评论 -
43、二叉树-验证二叉搜索树
所以对于当前节点来说:我的左节点要小于我,我的右节点要大于我,我左节点,右节点也是二叉搜索树。如果当前节点为null,直接返回。原创 2024-04-19 22:55:40 · 137 阅读 · 0 评论 -
42、二叉树-将有序数组转换为二叉搜索树
既然数组已经有序,所以我们可以直接从中位数开始建立当前节点,那么左边就是我的左子树,右边就是我的右子树,依次递归。什么是平衡二叉搜索树:对于每个节点来说我左子树深度和我的右子树深度差值不能大于1。什么是二叉搜索树:对于每个节点来说,我的左节点小于我,我的有节点大于等于我。原创 2024-04-19 00:03:18 · 115 阅读 · 0 评论 -
41、二叉树-二叉树的层序遍历
层序遍历就是从左到右依次遍历。这个时候就可以使用队列的方式。例如先把头节点入队,然后遍历开始,首先计算队列长度,第一层,长度为了,遍历一次,依次出队,头结点出队,然后头结点的左右子节点入队。再次遍历,队列长度为2,在出队入队,队列长度为4。这样每次每次遍历都是把当层的所有节点轮询完成,然后每个节点的左右节点在入队,完成下一层的关联。原创 2024-04-18 23:50:43 · 319 阅读 · 0 评论 -
40、二叉树-二叉树的直径
最长路径,有两种情况,第一种经过根节点的最长路径,第二次不经过根节点的最长路径。那么不经过根节点的最长路径有max(左子树,右子树)得出,然后在和经过根节点的最长路径相比。原创 2024-04-18 23:41:36 · 109 阅读 · 0 评论 -
39、二叉树-对称二叉树
复制出一个二叉树b,加上原二叉树为a。原创 2024-04-18 00:28:30 · 197 阅读 · 0 评论 -
38、二叉树-反转二叉树
对于当前节点来说就是我的左右子树交换,然后进行递归即可。采用层序遍历,每个节点的左右子树交换。原创 2024-04-18 00:18:41 · 205 阅读 · 0 评论 -
37、二叉树-二叉树的最大深度
第一种方式递归,当前节点最大深度=max(左子树的最大深度,右子树的最大深度)+1。原创 2024-04-17 23:48:41 · 207 阅读 · 0 评论