力扣
文章平均质量分 70
力扣题
Yorelee.
这个作者很懒,什么都没留下…
展开
-
力扣:503. 下一个更大元素 II(单调栈)
是很典型的单调栈的模板题。循环数组,只需要将原始数组拉长一倍即可。原创 2024-05-18 11:00:00 · 161 阅读 · 0 评论 -
数据结构:二叉树的序列化和反序列化(序列和二叉树结构一一对应)
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。原创 2024-05-16 14:02:04 · 1510 阅读 · 0 评论 -
LeetCode:116.填充每个节点的下一个右侧节点指针
题目:分析题意容易关注到只需要将每层结点连接起来,因此我们只需要把每层结点求出来即可,即使用层次遍历。转载 2024-05-11 11:00:24 · 525 阅读 · 0 评论 -
力扣hot100:199. 二叉树的右视图/437. 路径总和 III(dfs/回溯/树上前缀和/哈希表)
前缀和的方法如果之前接触过应该很容易想到,不过这里需要学习深度优先遍历的方法,更深入理解dfs。我们真的是需要哈希表找到需要的值吗?在这里我们只需要之前有多少个这样的值就行了!这个问题使用dfs可以解决,不过实现起来比较复杂,时间复杂度是。右视图实际上只需要找到,每一层的最右边的那个结点即可。之后很容易想到使用哈希表直接查找使用存在所需要的值。发现使用树上前缀和很容易解决,最坏时间复杂度也是。差点因为是个中等题打退堂鼓。,所以我们先考虑使用前缀和。我们先考虑其他方法。原创 2024-05-05 18:09:24 · 1274 阅读 · 0 评论 -
力扣hot100:543. 二叉树的直径/108. 将有序数组转换为二叉搜索树
二叉树的直径 = 二叉树的是指树中任意两个节点之间最长路径的。遇到二叉树的问题很容易去直接用求解的目标去定义递归函数。但是仔细考虑,返回树的直径并不能向上传播。因此我们只需要求高度就行。树求高度实际上是一个树形dp。原创 2024-05-04 16:24:12 · 481 阅读 · 0 评论 -
力扣hot100:101. 对称二叉树(双指针以不同方式递归)
看了第一个样例,很容易直接层序遍历看每一层的前后是否相同。但接下来这个样例告诉你,不能这样做。原创 2024-05-03 18:00:00 · 403 阅读 · 0 评论 -
力扣hot100:136. 只出现一次的数字 及其衍生
的特点是,除了一个元素只出现一次,其他元素出现两次。我们用异或的方法很容易去掉出现两次的元素!两个相同的数异或就消掉了~原创 2024-04-17 22:45:17 · 216 阅读 · 0 评论 -
数据结构:链表的双指针技巧
链表的技巧原创 2024-03-30 21:00:04 · 1038 阅读 · 0 评论 -
数据结构:差分数组
它常用于数组和列表数据结构中,可以让区间修改的操作时间复杂度降低到O(1),查询操作的时间复杂度为O(n)。差分数组最大的优势在于能够非常高效地对原始数组的连续区间进行增减操作。在处理大量区间增减值的问题时,差分数组能够大幅度减少计算量,尤其是在数据量大、修改操作频繁的情况下。看完本篇文章对差分的阐述,看到这题很容易想到差分,因为是频繁对区间的修改。差分数组是处理数组区间修改问题的强大工具,它通过巧妙地利用差分的思想,使得区间操作变得简单高效。中的某个元素值,或者得到修改后的数组,我们需要对差分数组。原创 2024-03-30 08:00:00 · 315 阅读 · 0 评论 -
单调栈的使用一:接雨水
当我们在遍历数组时,遇到一个当前遍历的柱子高度比栈顶元素的高度大的情况,这意味着我们找到了一个潜在的凹形区域的右边界。因此,单调递减栈在这个问题中的应用确保了每次计算的是有效的凹形区域,并且能够正确地计算出每个区域能够积累的水量,从而得到整个数组中能够积累的总水量。对于栈中每个元素,它的左侧边界是栈中之前的元素,右侧边界是当前考察的元素。:通过迭代的方式,栈帮助我们一步步向右“扫描”数组,每次遇到能形成新的凹形区间的元素时,就计算该区间的积水量。位置的柱子的较矮者决定的,减去凹底的高度,即。原创 2024-03-29 15:43:50 · 563 阅读 · 0 评论 -
数据结构:Trie(前缀树/字典树)
Trie 又称字典树、前缀树和单词查找树,是一颗非典型的多叉树模型,即每个结点的分支数量可能为多个。Trie这个名字取自“retrieval”,检索,读音和 try 相同。原创 2024-03-26 08:00:00 · 1194 阅读 · 0 评论 -
力扣hot100:207. 课程表
这是一道拓扑排序问题,也可以判断图中是否存在环。原创 2024-03-25 16:45:02 · 333 阅读 · 0 评论 -
力扣hot100:994. 腐烂的橘子(多源BFS)
多源BFS原创 2024-03-24 19:45:29 · 257 阅读 · 0 评论 -
力扣hot100:4. 寻找两个正序数组的中位数(归并排序/二分/双指针)
多种方法原创 2024-03-21 10:00:00 · 634 阅读 · 0 评论 -
力扣hot100:153. 寻找旋转排序数组中的最小值(二分的理解)
当nums[left]>nums[mid]时,顺序的区间一定是[mid+1,right],而不是[mid,right],因此我们是right=mid,而不是right=mid-1!,我们知道二分实际上就是找到一个策略将区间“均分”。对于旋转数组问题,在任何位置分开两个区间,如果原区间不是顺序的,分开后必然有一个区间是顺序的,一个区间是非顺序的,我们知道最小值必然是在非顺序的区间里。我们需要特别注意二分中的边界条件,比如下面考虑到的,整个区间是顺序的,以及如何精确的找到非顺序区间的答案区间。原创 2024-03-20 11:40:05 · 403 阅读 · 0 评论 -
力扣hot100:33. 搜索旋转排序数组(二分的理解)
因此我们只需要分三类讨论即可,即[left,right]在左增区间,[left,right]在右增区间,[left,right]在两个区间中间。只有最后一种情况需要讨论更多一点。最后一种情况又分为,target在左增区间中,target在右增区间中、nums[mid]在左增区间中、nums[mid]在右增区间中:一共4种情况。①mid在右增区间中,target小于mid的值 或者 target大于mid的值且大于nums[right]的值,即target在左增区间中。如果使得right=mid-1;原创 2024-03-18 00:06:07 · 466 阅读 · 0 评论 -
力扣hot100:34. 在排序数组中查找元素的第一个和最后一个位置(二分查找的理解)
二分原创 2024-03-17 18:15:49 · 412 阅读 · 0 评论 -
力扣hot100:416.分割等和子集(组合/动态规划/STL问题)
同时由于长度最长200,数值最大为100,因此数的范围最大为1原创 2024-03-16 21:02:47 · 980 阅读 · 1 评论 -
图中的最短环问题
并且在求出的最短环之后,可以不再将加入到图中,因为对于问题求解已经没有存在的意义了,因为经过的最短环一定在讨论删除边时被求解出来,任何其余其他的经过的环 均不能构成问题的最优解,因此仍然保留只会增加冗余遍历。,经过边的最短环就是v1->v2->···->v1,如果不存在则说明没有经过边的环。,然后对删除的边,查看v2到v1是否存在一条路径或多条路径,如果存在,则。原创 2024-03-12 19:31:46 · 359 阅读 · 0 评论 -
力扣hot100:152.乘积最大子数组(动态规划)
一个子数组问题,我们要使用线性dp,最好先考虑以i结尾,如果定义dp[i]为前i个数最大子数组乘积值 那么dp[i-1]就无法转移到dp[i]。因此我们先考虑dp[i]定义为以第i个数结尾的最大子数组乘积值。最大子数组和是一个动态规划问题,定义dp[i]表示以nums[i]结尾的最大子数组和,那么dp[i]=max(dp[i-1]+nums[i],nums[i])。原创 2024-03-10 23:13:41 · 382 阅读 · 2 评论 -
力扣hot100:22.括号生成(回溯)
复习一下:回溯法解决的问题都可以抽象为树形结构。回溯法解决的都是在集合中递归查找子集,。对于同一层而言,其儿子都是等价的不同情况,因此当儿子处理完之后,儿子应该回撤使得本层能继续遍历其他儿子。同理本层应当回撤当父亲结点遍历其他儿子。对于排列组合的回溯问题,由于每一层当前集合中的每一个数都能被选择构成不同的情况,因此函数体用for循环遍历选择元素,让不同元素依次排在答案中本层的“第一位”往下遍历。如果是子集问题,可以在本层按顺序选择,下一层就不再选择本层之前被忽略的元素。原创 2024-03-10 12:34:30 · 510 阅读 · 2 评论 -
力扣hot100:240.搜索二维矩阵II(脑子)
吉大21级算法分析与设计的一道大题,由于每一行都是排好序的直接逐行二分 可以达到:O(mlogn)。但是这里追求更广的思路可以使用其他方法。原创 2024-03-08 21:57:41 · 623 阅读 · 0 评论 -
力扣hot100:76.最小覆盖子串(滑动窗口)
本题使用滑动窗口解决,用right表示滑动窗口的右边界,left表示滑动窗口的左边界。寻找可行解,我们可以这样约定滑动窗口的意义:right指针向右移动,是使得滑动窗口找到可行解。left指针向右移动是为了更新窗口使得其可以继续寻找下一个可行解。那么本题中滑动窗口的right指针移动是为了使得窗口内包含t的所有字符,而当已经包含了所有字符时,这就是一个可行解,我们移动left指针使之“不可行”,寻找下一个可行解。原创 2024-03-08 11:39:58 · 384 阅读 · 0 评论 -
力扣hot100:239.滑动窗口最大值(优先队列/单调队列)
单调队列,优先队列原创 2024-03-06 17:12:31 · 427 阅读 · 2 评论 -
力扣hot100:560.和为K的子数组(前缀和+哈希表)
分析:这个题目乍一看,数据大小用暴力解法大概率会超时,可能想用双指针,但是问题出现在 可能存在负数,也就是说即使是找到了一个答案,后面也可能存在负数和正数抵消,又是答案,因此不太行。那如何想到前缀和的呢?(我做的时候只能说灵光乍现,我也记不起来怎么想到的)也许是因为,这里相当于是求 和为k的区间 个数,能快速求出区间和的就是前缀和了,拿到前缀和之后,对于任何一个sum[i](0~i的和),如何求得sum[i]-sum[j]=k?实际上我们发现 值sum[j] 是确定的!原创 2024-03-05 13:54:42 · 432 阅读 · 0 评论 -
力扣hot100:438.找到字符串中所有字母异位词(滑动窗口)
滑动窗口原创 2024-03-05 09:05:54 · 407 阅读 · 0 评论 -
力扣hot100:15.三数之和(双指针/哈希表)
分析:三数和问题,这里和两数之和不一样,返回的是值,因此可以对其进行排序,使用双指针。一、一层循环+双指针。原创 2024-03-04 16:30:52 · 865 阅读 · 0 评论 -
力扣hot100:1.两数之和(哈希表)
输入中可能存在重复值。分析:本题需要返回的是数组下标,因此如果需要使用排序然后双指针的话,需要用到哈希表,但是由于输入中可能存在重复值,因此哈希表的value值必须是vector。使用双指针求目标值target,利用的是数值大小关系,需要对数组进行排序。然而原数组下标是答案的话,我们单纯排序是解决不了的。这里使用一个类似动态规划的哈希表。一、一层循环+哈希表。原创 2024-03-04 15:17:57 · 712 阅读 · 0 评论 -
力扣hot100:42.接雨水(双指针/动态规划/贪心)
为了理解这一性质,我们可以这样想象:取出左边最高和最边最高的水柱,将其比作一个碗的边界。中间坑坑洼洼,忽高忽低,高低错落,碗面中的一个点的能接水的最高高度是多少呢?从左向右依次看,对于第一个水柱而言,直到遇到一个比它高的水柱,其中间的水柱都由第一个水柱的高度决定。一种特殊情况是,最后一个找不到比它高的水柱,此时对它我们从右往左看即可。下标为i的水柱能接的雨水,取决于它左边最高的水柱 和 右边最高的水柱的最小值(包括它本身)。left_max[i]:表示从0~i 中 水柱高度的最大值。原创 2024-03-03 12:00:10 · 401 阅读 · 0 评论