- 博客(35)
- 收藏
- 关注
原创 二叉树-二叉搜索树
二叉搜索转累加树,我们可以看到蓝色字,其大小是从右下开始的,其实是中序遍历的镜像,我们如何体现这种镜像呢,我们利用左大右小的特性,在每一个根节点选择向左找还是向右找,实现了类似二分查找的效果。另外这道题某个很幽默的测试用例的确很幽默,导致我的min和max的初值变成这个样子。如果说是一个普通二叉树这样做完全没有问题,但是对于二叉搜索树,显然没有利用其特性。那么如何修改呢,我们可以维持一个min,一个max分别记录右左子树的极值。,之后通过中序遍历递增的顺序(现在变成递减,可以很好的解决这道题)。
2025-06-09 10:54:08
390
原创 链表好题-多种实现
其实思路是一样的,他那边的合并链表,我们主要是利用p = nxt这一条语句做到的(好好体会),反转链表是通过栈来翻转的,寻找中点是通过。这种方法非常经典,一道题顶三道题,其中各种边界条件也令人很头疼。找到的,同样要注意边界条件。这道题难度还是比较高的。这道题非常经典,很多大厂都作为面试题。方法一:寻找中点+翻转链表+合并链表。
2025-06-05 10:40:12
345
原创 数组-二分法-分段二分
这道题和上道题最大区别就是这道题数组中可能存在重复值。尤其如果是边界处存在重复值,那么就很有可能导致我们无法找到分界条件,所以我们每一次二分之前都要进行去重。分段二分,核心就是nums【0】因为它是分界点,当算出一个mid时候,相当于将图像分为了四段,我们每段都进行范围收缩。一定要自己画一画帮助理解。
2025-06-04 10:37:45
167
原创 数组-二分查找-峰值问题
寻找峰值,其实就是从整体变为了局部,这也是二分的重要应用之一,需要注意的是边界条件,我们一定要保证nums【mid+1】是有定义的,所以mid + 1 最大为 n-1,那么mid的最大就是n - 2,举个例子,如果n = 2,right = 2, left = 0, 那么mid = 1 , mid+1 = 2, 超出数组限制,所以我们的right只能取n-1。一模一样的答案,留给大家做一下。
2025-06-04 10:05:30
174
原创 数组-差分数组抽象版
里面是有一种单调关系。2:我们的二分是基于自变量的,比的时候是基于函数的。自变量的取值范围,也就是吃香蕉的速度,根据题意应该是一到最大的一堆香蕉的数量,所以可以遍历数组找到最大值,也可以直接以题目给的范围作为范围。1:函数的意义,首先是我们发现了一种单调的关系并且找到了一个边界条件,所以我们考虑可能使用二分,之后求什么什么就是自变量,边界是什么,什么就是函数。1:函数的意义,首先是我们发现了一种单调的关系并且找到了一个边界条件,所以我们考虑可能使用二分,之后求什么什么就是自变量,边界是什么,什么就是函数。
2025-06-03 11:19:12
136
原创 数组差分数组
那为什么right = mid,注意第一步,right是虚的没意义的,我们之前实际上,是比较的right + 1,所以我们令right = mid是有道理的。,本题选择左闭右开区间表示为right = nums.size(),这一点一定要理解,因为是右开区间,所以我们实际的right踩得都是虚的是假的,真正有实际意义的是right-1.我们之前,left = mid + 1,判断的是nums【mid】 == target, 我们推导一下不就是 mid = left - 1.同理 mid = right。
2025-06-03 10:07:44
111
原创 数组-滑动窗口
我们来仔细看一下代码,尤其是其变化的部分,第一:start和len没了,因为这两个参数就是为了求子串,但这道题是判断(bool)所以不需要那两个参数,第二:写答案的逻辑,也是我们主要改变的地方,我们可以看到,其改变就是针对子串长度固定这个问题,从记录最小覆盖的子串,变成了是否存在子串排列。,什么时候扩展窗口---当我们的窗口中覆盖了所有的子串所需字符(通过第一个难点解决),什么时候缩窗口---当扩展完后,我们开始缩窗口,直到再缩就不满足覆盖条件时,我们选择记录答案,也就是第三个问题。
2025-05-30 12:20:29
340
原创 数组-差分数组
关于细节,我们注意到差分数组初始为零,那么对其求差分依旧是零,所以我们省略了这一步,其次题目中索引都是从一开始的,所以我么要修改索引(减一)。还有就是一个小点,我们必须明确题目中的边界条件,比如index是否是从0开始的,或者是否是左闭右开区间,这些只能通过题目来领悟。不说一模一样,只是十分相像。,这个问题我们通过第一个循环解决,我们必须要有这个边界,第一道题中是直接给出的,第二道题我们只能自己求。首先要识别这道题给了很多区间,也给了要在区间内统一修改的值,所以是一道典型差分数组的题。
2025-05-30 10:09:21
213
原创 前缀和+哈希
首先我们发现k是固定的,如果num【i】也固定,那么第三个数也是固定的,所以这种存在逆运算的情况我们就可以考虑哈希表。本体采用了前缀和和哈希表,要注意的点主要是边界条件,我们要考虑presum一定要取到n而不是n+1,不然会丢解。这一版代码就是翻译了题目的意思,但是其时间复杂度是很高的。所以我们如何可以优化呢。但是这道题是滑动窗口的一个典型的反例,也就是num【i】不能保证全为正数。也可以把两个for循环合并,这样更好。拿到题目第一直觉是使用滑动窗口,所以我们来看第一版代码,前缀和。
2025-05-29 09:48:03
238
原创 前缀和+哈希表
看到题之后就知道要用前缀和和哈希表, 也就是presum【i】%k 等于presum【j】%k 所以我们可以在presum中直接存储resum【i】%k,之后将第一次出现的resum【i】%k存储到map中(为什么是第一次呢?因为当我们第二次相等的时候,就可以通过map找到长度,之后每相等一次就更新一次,求最长距离。因为要最长子串中1和0数量相同,那么当0转化为-1的时候,问题就变成了presum【i】 - presum【j】 = 0. 这一点很重要。
2025-05-28 20:39:22
116
原创 数组-前缀积
但是却出现了报错,核心就是我们无法保证num【i】!所以如何得到正确答案呢,我们可以将除法转化为乘法, 也就是将i 左右两端的地方去乘起来。拿到题目后想到可以用前缀积来做,第一版代码。
2025-05-28 19:43:52
128
原创 矩阵前缀和
最容易理解的就是通过图像,只要图像想通,这道题就不会错。这道题是典型的矩阵前缀和,这种题的解法比较固定。在一维前缀和基础上进化。另外这道题还有一点,就是要注意边界条件。
2025-05-28 19:27:44
149
原创 数组前缀和
对于前缀和这种技巧,核心就是写一个presum,他的形式不一定相同,但是最好写完就定下来,不要搞混,如果拿不准边界条件,就将presum和nums区分出来看,这道题中presum的最后一个元素是presum【n】,nums最后一个元素nums【n-1】。想一下最后一个元素,当然是presum[i] = nums[i - 1] + presum[i - 1];另外这种写法有个关键就是要对presum初始化,其目的当然是对presum【0】设初值。但是呢,这样子的效率是很低的,没啥说的,相信大家可以秒杀。
2025-05-28 11:04:49
201
原创 双指针-三数之和
我们回到定义,其实要保证的边界条件是lo < hi 而且lo 和 hi都要大于 i, 所以当 i = n - 3 的时候, 有最后一对可能解,lo = n-2, hi = n-1 这之后无法保证lo < hi。本题的难点应该是边界条件,首先注意到nums[i] == nums[i-1] 这种形式意味着当前的下一个才不同,所以根据不同情境选择。这道题可以算是二数之和的扩展,只要遍历num[i],那么使用二数之和的方法令target = 0 - num[i] 就可以了。
2025-05-28 10:17:52
105
原创 二维数组-1329
本题还是有巧思的,首先一看只要斜着便利数组,在对于每个数组使用sort则得到正确答案,但是问题是这道题的数组不是正方形,所以比较难确定边界条件(i>.j 还是i<j),所以唯一不变的便是i和j的差值为1;
2025-05-27 19:28:17
206
原创 数组双指针
为什么能想到呢,主要是只有三个数,可以穷举。相较于计数排序,采用在原数组上进行交换,而不是统计数量。其实就是p指针分类, 等于零的就给p0, 等于2 的就给p2,最后剩下的就是等于1的在中间。但是题目附加的条件,只扫描一次,那么就没办法统计个颜色出现的次数了。拿到这道题其实最应该想到的方法是计数排序,也是最简单的。所以我们采用三指针,从中间开始向两边写。
2025-05-27 11:19:08
108
原创 数组双指针
首先拿到题就要分情况讨论,第一不相等:更新计数器,第二相等且count<2 这是答案,slow动,储存答案,第三相等但是count超了,啥也不做,fast++;另外一个重点是更新count的时机:当fast!= fast-1时。slow的意思是slow之前是正确答案,fast去探路,slow修改答案。如果没有思路的话,就尝试分情况讨论,把能做的先做了。
2025-05-27 10:39:35
97
原创 二维数组-48
旋转图像,这意味着你需要直接修改输入的二维矩阵。请你将图像顺时针旋转 90 度。错误点一:交换范围选择上半三角或者下半三角。方法比较巧妙,并不是一环一环去旋转。错误点二:巧用迭代器进行反转。使用另一个矩阵来旋转图像。先对角线翻转在行逆序。
2025-05-27 09:32:05
175
原创 力扣笔记(自用)11
使用双指针,主要就是考虑,将两个指针分制在数组两端,初始值面积底边长度最大,所以如果想继续增大面积,由于底边必然减小,所以我们把指针数组值小的一方变动。核心就是底边减小,我们期望在高上增加。轴共同构成的容器可以容纳最多的水。失败了,暴力解法,超出时间限制。找出其中的两条线,使得它们与。返回容器可以储存的最大水量。
2024-05-08 16:07:16
230
1
原创 力扣笔记(自用)191
这种方法的核心思想就是以零的数量将数组分为三种情况(没有0,一个0,两个0),当数组有两个零时直接返回全零数组,当数组没有零时,将一个数组分为两段,一个从左往右乘,一个从右往左乘,没有第一种的高时间复杂度,也不需要考虑第二种的特殊情况,总之很牛*。最基本的思路,使用双层循环,分别相乘。为了深入了解这些生物群体的生态特征,你们进行了大量的实地观察和数据采集。可以先求出整个数组的乘积,在将乘积分别除以对应位的数组元素。个生物群体的数量从总体中排除后的其他数量的乘积。中的数据计算得出的结果,其中。
2024-05-07 11:21:16
179
原创 力扣笔记(自用)941
此题比较简单,核心思路就是找到什么样子的是峰值函数,首先“凸”是典型的峰值函数,但是只允许有一个,所以用flag的值来记录“凸”出现的次数。其次就是找到其他可以导致失败的情形,比如“凹”形,以及直线形,在分别排除所有情况后,就可得到最后结果。简化方法,将数组分成两段,前一段判断升,后一段(不论是否到最后)判断降。两段拼起来,如果是数组长度,则说明到最后也符合先增后减,如果没有到最后,则返回false。满足下述条件,那么它是一个山脉数组。,如果它是有效的山脉数组就返回。让我们回顾一下,如果。
2024-04-25 14:22:24
310
1
原创 力扣笔记(自用)914
力扣官方题解一,暴力解法,首先找到所有的数字出现的次数存到count数组中,之后筛除其中的0值,将非零值存到values中。之后从2开始,用values中每一项都除x,观察是否有余数,也就是看看x=2是否是全部次数的公因数。之后++x判断其他数是否为公因数,直到结束。核心思路就是使用gcd函数求解最大公因数,不需要一个个试。其中g中存储数字出现的次数,初始值为-1,第一次判断取~g,判断是否为第一个,如果是第一个就在else中赋初值(-1取反为0)。给定一副牌,每张牌上都写着一个整数。
2024-04-24 10:12:17
142
原创 力扣笔记(自用)888
方法二简化了很多,主要思路是求出两数组之和,用两数组之和除二减去ali的和,意思是求出ali还差多少可以达到相等,同时也是bob相对于相等而言多的总数。此方法首先对两个数组排序,求得两数组之和的差值,所以我们只要找到ali和bob数组中相差为此差值的一组值,就是题解。本题中需要注意这种解题方法,同时这里面有一个问题就是Alice的总数总是比bob少,所以bob每次都要把自己的糖果给alice,请大家端正态度,不做舔狗。是鲍勃必须交换的糖果盒中的糖果的数目。是爱丽丝必须交换的糖果盒中的糖果的数目,
2024-04-23 13:58:15
269
原创 力扣笔记(自用)849
思路很简单,主要是统计零出现的最大长度,之后除以二就好了,主要是要考虑一下关于数组的边界问题,对两种边界情况分别进行讨论,对于首尾项距离不用除二,只需要考虑如何得到首尾零的长度就好。亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上。至少有一个空座位,且至少有一人已经坐在座位上。返回他到离他最近的人的最大距离。解法一:各种补窟窿,终于过了。思路不变,格式修改一下。
2024-04-23 09:51:31
152
原创 力扣笔记(自用)830
本解法在力扣中提交成功,但是存在一个小bug,请大家考虑为什么不影响最后的运行,又如何改正。分别表示该分组的起始和终止位置的下标。我们称所有包含大于或等于三个连续字符的分组为。中,包含由一些连续的相同字符所构成的分组。在一个由小写字母构成的字符串。
2024-04-22 09:55:54
192
原创 力扣笔记(自用)747
这题主要思路就是找到最大值,之后在对找出的最大值进行判定,判断是否大于其他数据的二倍。属于比较简单的一题。请你找出数组中的最大元素并检查它是否。
2024-04-15 10:44:15
251
1
原创 力扣笔记(自用)724
开始打算同时两边开始加每循环一次判断一次,判断左右是否相等,十分麻烦。最后选择另一种思路,先求合,在通过减法(减去当前值) 得到右边的值,在判断,比第一种要考虑的情况少很多。,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果中心下标位于数组最左端,那么左侧数之和视为。如果数组不存在中心下标,返回。如果数组有多个中心下标,应该返回。
2024-04-15 09:26:52
213
1
原创 力扣笔记(自用)717
核心思想就是不考虑其他,从首项开始,遇到一就跳一个(认为是第二种字符),最后看数组是否可以匹配长度。,如果最后一个字符必须是一个一比特字符,则返回。
2024-04-12 11:31:22
178
1
原创 力扣笔记(自用)674
此题比较简单,主要是不要忘记可能存在很多递增子数组,需要拿到后进行比较大小。其次就是不要忘记最后一次比较,当数组遍历完后是不经过else的,所以这次循环的current的数据还没有与max进行比较,所以需要最后比较一次得出最长递增数组。给定一个未经排序的整数数组,找到最长且。,并返回该序列的长度。)确定,如果对于每个。就是连续递增子序列。
2024-04-11 10:51:03
234
1
原创 力扣笔记(自用)665
主要思想是通过找到第一个需要改变的元素,判断其前一个和后一个的大小,如果替换当前元素后,仍然前一个元素比后一个元素大,那么就给J再次加一。难点:考虑边界情况,尤其是nums[0]和nums[1],以及在循环中的超限问题,核心就是如何对改变后的数组重新判断其递增性。实现:不在一个循环中完成当前的对J的自增操作。而是通过对当前值付一个大值,使得其在下一次循环时自动实现对J的自增。我们是这样定义一个非递减数列的: 对于数组中任意的。个元素的情况下,该数组能否变成一个非递减数列。
2024-04-11 09:42:56
178
1
原创 力扣笔记(自用)628
解题思路:分成两部分,第一部分全为正数,或者全为负数。第二部分有正有负,主要考虑的就是最大的三个数和最小的两个数。解题思路:不用考虑分组情况,只要选择这两种情况大的一个就好。,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
2024-04-10 10:16:26
133
1
原创 力扣笔记(自用)605
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。来记录连续的0(即空地)的数量,并假设花坛的左边界有一个虚拟的0,这样可以简化边界条件的处理。数组,当遇到一个1(表示花朵或障碍)时,它会计算并累加在之前的连续0中可以放置的花朵数量(通过将。在前端和后端分别添加一个0(空花坛),这样就完全不需要考虑方法一中的几种特殊情况(边界情况)。不需要走完全程,如果已经放置足够的花,就可以跳出循环。,能否在不打破种植规则的情况下种入。
2024-04-09 09:58:55
150
原创 力扣练习笔记(自用)581
不影响整体排序,只是找到最大值(时刻更换)与当前位进行比较,直到最大值比到结尾(从小到大),取得最后一次交换值,为最后变化的位置。O(n log n),主要是由于对复制数组的排序,相比之下第二种时间复杂度为O(n),只遍历一次。核心思路: 复制一个数组并排序,找到复制后数组和原数组从哪里开始有不同。,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。子数组,并输出它的长度。
2024-04-08 11:17:34
235
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人