
leetcode
文章平均质量分 74
小林想被监督学习
好想找实习的编程小萌新,想找人一起学习,监督我,不在迷茫ヾ(;゚;Д;゚;)ノ゙
展开
-
leetcode 315. 计算右侧小于当前元素的个数(hard)【小林优质解法】
现在博主来介绍如何通过归并排序来解决该题,博主就默认大家是很理解归并排序的,要是不理解一定要先理解了归并排序才能看懂下面的内容,推荐看归并排序(递归)题目要求统计逆序对个数,我们可以将数组分为左右两个区间,先统计左区间的逆序对个数 A,再统计右区间的逆序对个数 B,最后统计左区间取一个数据,右区间取一个数据组成的逆序对的个数 C,通过 A+B+C 便能得到数组中所有的逆序对个数,其中,统计左区间的逆序对个数 A 和右区间的逆序对个数 B 与统计整个数组的逆序对相同,所以是递归操作原创 2023-12-31 00:12:56 · 1104 阅读 · 0 评论 -
leetcode LCR 170. 交易逆序对的总数(hard)【小林优质解法】
对于该题的解法,本编博客是基于归并排序之上来进行解决的,所以清楚归并排序的流程非常重要,如果对归并排序不清晰,推荐先看归并排序(递归) 现在我就认为大家是已经对归并排序了如指掌的,我们先来分析一下本题如何解决,如果采用暴力解法的话是很简单的,如下,用 i 指针指向下标 0 ,j 指针指向下标 1 ,判断此时 i ,j 指针指向的数据是否为逆序对,然后让 j 指针向后移动,遍历完以后再将 i 指针向后移动,j 指针在 i 指针之后重新遍历,时间复杂度为 O(n^2),这个时间复杂度在原创 2023-12-30 12:54:49 · 1238 阅读 · 0 评论 -
leetcode LCR 159. 库存管理 III(easy)(小林出品必属精品)
该题简单来说就是去获取数组中最小的 cnt 个数,解决该问题有很多的方法,可以将数组直接排好序,返回最小的 cnt 个数,时间复杂度为 O(nlogn),也可以使用大根堆来辅助解决,时间复杂度也为O(nlogn),该题我们采用的是快速选择的方法,时间复杂度能达到 O(n)原创 2023-12-27 16:42:47 · 1298 阅读 · 0 评论 -
leetcode 215. 数组中的第K个最大元素(medium)(小林出品必属精品)
要先随机取一个基准数据 key,按照基准数据 key 将数组划分为 3 个区间,分别是 > key , = key ,< key 的区间,根据每个区间的数据个数,判断第 K 个最大元素在哪一个区间,再去该区间用同样的方式寻找数据。当 k key 的区间,那么我们在区间【right,R】(> key)的区间中继续执行相同的操作去寻找第 K 个最大元素(递归)对于将数组通过基准元素划分为 3 个区间的方法推荐先看。快速选择方法的核心就是快速排序的核心,原创 2023-12-27 14:20:38 · 556 阅读 · 0 评论 -
leetcode 912.排序数组 (medium)(优质解法)
本题是一个简单排序数组的题,该篇博客中我们采用快速排序的方法来进行排序 快速排序的核心就是随机选择一个基准数据,按照基准数据将数组划分为 3 个部分,分别是 < key,= key ,> key 的三个部分原创 2023-12-27 13:19:28 · 400 阅读 · 0 评论 -
leetcode 75. 颜色分类(medium)(优质解法)
其中 left 指针指向最后一个 0 的位置,right 指针指向第一个 2 的位置,i 指针用来遍历数组,划分遍历到的数据。(2).nums[ i ] = 1 ,由于 1 区间就在 i 下标之前,所以当前遍历到的数据 1 实际上就在 1 区间中,本题的含义很清晰,对于数组中 0,1,2 三种数据,我们要将其进行排序,如果用普通的排序方法来解决该题不是最好的办法。当 i = right 时就不存在未处理的数据了,处理完毕,划分结束。原创 2023-12-26 23:03:24 · 500 阅读 · 0 评论 -
leetcode 1419. 数青蛙(medium)(优质解法)
当 i 继续向下遍历,遍历到 c 字符,先要判断此时是否有已经叫好在休息的青蛙,hash 数组中 k 字符对应的个数就是休息青蛙的数目,此时有 1 只青蛙在休息,所以不需要新的青蛙来叫,直接让正在休息的这个青蛙叫即可。,但此时在 hash 数组中 c 字符对应的数据为 1 ,代表有 1 个青蛙叫到了 c 字符,可以让叫到 c 字符的青蛙继续叫 r 字符,所以在 hash 表中 c 字符对应的数据 - - ,r 字符对应的数据 ++本题采用的解法是模拟,模拟题目的要求,找到最终的结果。原创 2023-12-26 16:51:06 · 1065 阅读 · 0 评论 -
leetcode 38. 外观数列(medium)(优质解法)
根据上述要求,R 指针移动到当前位置,此时 R 指针指向的数据和 L 指针指向的不同,L 指针指向的就是当前数的数据,个数为 R - L,将个数和数据拼接到字符串中,得到 21。同理,当 L 和 R 指针相同 R 指针就向后移动,要注意边界,R 指针移动到字符串边界时要停止,得到数据 2 个数 R - L = 3 ,将其拼接到字符串中得到 2132。先让 L 和 R 指针指向下标为 0 的位置,描述的核心就是要获得连续字符的个数,首先判断 R 指针和 L 指针指向的数据是否相同,相同 R 指针就向后移。原创 2023-12-25 23:06:22 · 531 阅读 · 0 评论 -
leetcode 6. N 字形变换(medium)(优质解法)
可以来找以下其中含有的规则,我们要获取的正确答案就是从左到右逐行读取,首先要读取的是第 0 行(首行),读取到 P I N ,在字符串中的下标对应为 0 ,6 ,12,下标之间相差 6 ,P 到 L 有 6 个字符,所以。对于 1 ~ numRows - 2 行的字符,可以每两个字符为一组,如字符 A ,L 为一组,A 的下标为 1 (行的下标与第一个字符的下标相同),L 的下标为 5 ,可以发现。,通过 这两个下标分别加上 d ,得到下一组字符的下标,获取所有符合条件的下标对应的字符即可。原创 2023-12-25 21:54:17 · 693 阅读 · 0 评论 -
leetcode 495. 提莫攻击(esay)(优质解法)
根据上图,假设 timeSeries 数组中的内容为 1,2,4,7 ,这是刷新中毒状态的时间,在时间 1 和 2 之间中毒的持续时间为 2 - 1 =1,此时 timeSeries[ i ] - timeSeries[ i-1 ] = 1 < duration ,这是在时间 1 中的毒。在时间 2 和 4 之间 timeSeries[ i ] - timeSeries[ i-1 ] = 4 - 2 =2 = duration ,中毒的持续时间为 duration=2 ,这是在时间 2 中的毒。原创 2023-12-24 19:26:58 · 734 阅读 · 0 评论 -
leetcode 1576. 替换所有的问号(easy)(优质解法)
通过题意我们要发现一些解题的方向,要将字符串中的?改为其他的字符,并且不能存在连续重复的字符,假设?所在的下标是 i ,那么?在第一位,要是去获取 i - 1 下标的字符会出现溢出,所以当 i == 0 时就不需要判断替换的字符是否等于 i -1 的字符了,情况(2)也是一样。所以核心的解题思路就是:先遍历字符串,找到?,然后再遍历 a ~ z 的字符,找到其中符合条件的字符。情况(3)就是普遍情况,需要判断替换的字符和?之前以及之后的字符是否相同,只有不同才能替换?原创 2023-12-24 18:36:46 · 402 阅读 · 0 评论 -
leetcode 面试题 17.19. 消失的两个数字 (hard)(优质解法)
进行异或操作时,相同的比特位为 0 ,不同的比特位为 1 ,我们现在有的数据是 tmp = a^b(a,b 是要获取的缺失的数),既然想要分离 a,b 的话,就需要找 a,b 的不同之处,我们可以找出 tmp 比特位为 1 的下标,比特位为 1 就代表该下标 a 和 b 的比特位不同,将该下标比特位为 1 的数和比特位为 0 的数分开,这样 a 和 b 肯定就分开了。首先需要了解异或的一些特性,a^0 = a, a^a = 0,简单来说异或的特性就是两个相同的数进行异或可以互相抵消。原创 2023-12-24 18:16:40 · 423 阅读 · 0 评论 -
leetcode 137. 只出现一次的数字 II
由上述条件我们知道,nums 数组中要是没有这单独的数字,那么里面的数都是 3 个,这也就代表每个比特位的数据总和都是 3 的倍数,在 nums 数组中有一个单独的数字就会导致每个比特位的总和 % 3 会有余数,这个余数就是单独的数字在 i 比特位上的数据。通过上述方法,依次获取单独的数字在每一个比特位上的数据,我们便得到了要找的单独的数字。外,其余每个元素都恰出现。中,除某个元素仅出现。原创 2023-12-24 12:53:45 · 369 阅读 · 0 评论 -
leetcode 371. 两整数之和(优质解法)
由上面的推算可以看出,进位 = a & b ,所以 2 + 3 的进位为:0010 & 0011 = 0010,但是进位是加到前一位的,所以实际上此时得到的进位还需要原创 2023-12-24 11:39:55 · 457 阅读 · 0 评论 -
leetcode 268. 丢失的数字(优质解法)
以示例1为例,nums=【0,1,3】,根据数组的长度为 3 可以知道,完整的数据应该是 0,1,2,3,我们可以将完整的数据和 nums 中的数据进行异或,这样的话 0,1,3 都有两个数据可以互相抵消,2 只有一个数据无法抵消,最终异或得到的结果就是 2,便得到了题目想要的结果。相同的两个数异或可以互相抵消。原创 2023-12-23 19:25:02 · 505 阅读 · 0 评论 -
面试题 01.01. 判定字符是否唯一(优质解法)
通过遍历获取到字符串中的一个字符后,要判断该字符之前是否出现过,即判断该字符所对应的二进制位是否为 1 ,比如现在得到了一个字符 b ,前四个二进制位为 0110 ,首先用字符 b - a 得到偏移量 1,让二进制位向右偏移 1 位,二进制位为 0011 此时 b 字符对应的二进制位移到了第一位,让 0011 & 1,得 1,代表 b 字符对应的二进制位为 1,说明之前 b 字符就存在于字符串中了,返回 false。本题属于很简单的一道题,有很多的解题方法,这里介绍一种不是太普遍的方法,通过。原创 2023-12-23 18:56:22 · 405 阅读 · 0 评论 -
leetcode 1314. 矩阵区域和(优质解法)
看了上述博客后解决该题目的主体就懂了,现在就要介绍一些细节问题,假设要计算的二维数组是(x1,y1)到(x2,y2)区间,按照题目的要求进行计算时会出现越界的情况,x1 和 y1 下标会出现比 0 小的情况,此时就需要把 x1 和 y1 放到 0 位置上,如下图所示,x2,y2 的下标会出现比 m-1,n-1 大的情况,此时也需要把 x2,y2,放到 m-1,n-1 的位置上。关于填充二维前缀和数组,以及如何利用二维前缀和数组计算出指定区间中的数据和,都在之前的博客中详细写过,推荐看。原创 2023-12-21 15:42:09 · 627 阅读 · 0 评论 -
leetcode 525. 连续数组(优质解法)
i 此时指向 1 ,前缀和为 0 ,所以在哈希表中找的 key 值就是 0,哈希表中没有,但是我们知道以当前位置为末尾是有符合条件的子数组的,就是 0,1,通过上面画的图知道,子数组的长度为 i - j ,此时符合条件的子数组长度为 2 ,i 为 1,所以 j 为 -1,所以我们要在哈希表在填入的初始数据为 (0,-1)当不同的下标对应相同的前缀和时,应该存储较小的下标,因为较小的下标离 i 下标较远,得到的子数组长度更长。,可以通过 j 下标与 i 下标的距离得到符合条件的子数组的长度。原创 2023-12-21 11:00:19 · 482 阅读 · 0 评论 -
leetcode 974. 和可被 K 整除的子数组(优质解法)
如上图所示,x 是以 i 为尾符合条件的子数组之和,可以推出:sum[ i ] - sum[ j ] = x ,以及 x % k = 0 ,得到 (sum[ i ] - sum[ j ])% k = 0;,因为数组中存在负数,所以 sum[ i ] 可能为负数,在 java 中,负数 % 正数得到的是负数,为了去除负数的影响,所以在取模时不能直接用 sum[ i ] % k ,而是应该用式子 ( sum[ i ] % k + k)% k。以该方法遍历所有的下标,便能得到所有符合条件的子数组的个数。原创 2023-12-20 18:12:44 · 457 阅读 · 0 评论 -
leetcode 560. 和为 K 的子数组(优质解法)
如上图,我们要统一以下标 i 为尾的符合条件的子数组个数,就需要在 0~ i -1 中找到下标 j ,使 j 到 i 之间数据和为 k,即我们要 0~ i -1 找到 j 下标使 sum[ j-1 ] = sum [ i ] - k ,找到多少个符合条件的 j 下标就代表以下标 i 为尾的符合条件的子数组个数有多少个,更简单来说就是,sum [ 0 ] - k = 1 - 3 = -2,在哈希表中没有 -2 这个前缀和对应的数目,所以没有符合条件的子数组,i 向下遍历,将当前的。原创 2023-12-18 15:47:18 · 974 阅读 · 0 评论 -
leetcode 238. 除自身以外数组的乘积(优质解法)
但其中有一个细节需要注意,在填充数组 f 时,当 i =0 ,会出现 -1 这个越界下标,所以我们需要提前初始化,当下标为 0 时,前缀积为 1,同理,在填充数组 g 时,当 i =nums.length -1 ,会出现 nums.length 这个越界下标,所以我们需要提前初始化,当下标为 nums.length 时,后缀积为 1。本题的题意描述得很清晰,我们要计算 nums 数组中每个下标除自身以外数组的乘积,对于 nums=【1,2,3,4】,result[ 1 ] = 1*3*4 = 12,原创 2023-12-18 09:40:42 · 711 阅读 · 0 评论 -
724. 寻找数组的中心下标
要判断左右两边的数据是否相同,我们可以判断左右两边的数据和之差是否为 0 ,如果为 0 ,就说明左右两边的数据和相同,我们可以利用数组 dp 来存储对应下标左右两边的数据和之差,如 dp[ i ] ,就代表 i 下标左右两边的数据和之差,当 dp[ i ] = 0 时就代表 i 下标左右两边的数据和相同,i 下标就为中心下标。本题的意思很简单,我们需要找到一个中心下标,中心下标左边和右边的数据和是相等的,在遇到一个题时,我们先想一下它的暴力解法,因为优化解法通常是由暴力解法演化而来的。原创 2023-12-17 15:11:59 · 376 阅读 · 0 评论 -
牛客网 DP35 【模板】二维前缀和
我们想要计算 dp[ i ][ j ] ,即从(1,1)~ (i,j)这个区间内的数据总和,根据右边的图,我们要计算的就是 A+B+C+D 的面积,我们可以将该式子替换为 (A+C)+(A+B)-A+D,A+C 的面积就是 dp[ i ][ j-1 ] 的值,A+B 的面积就是 dp[ i-1 ][ j ] 的值,A 的面积就是 dp[ i-1 ][ j-1 ] 的值,D 的面积就是 arr[ i ][ j ] 的值。根据该式子,当 i=0 或 j=0 时就会有 -1 的下标,就存在越界问题。原创 2023-12-16 19:24:05 · 988 阅读 · 0 评论 -
牛客网 DP34 【模板】前缀和(优质解法)
填充完 dp 数组后,我们便要使用 dp 数组来解决问题,假设 l =3,r = 5,要获取下标 3~5 的数据和,我们可以用 1~5 的数据和 dp[ 5 ] 减 1~2 的数据和 dp[ 2 ],即 dp[ r ] - dp[ l-1 ],所以我们要获取的结果 result = dp[ r ] - dp[ l-1 ]以数据 1,2,4,5,7,6 为例 ,根据题意我们知道,在题目中,数组的下标从 1 开始,而我们的 dp 数组的下标也应该从 1 开始(对于频繁计算一个区间的数据和,我们通常可以采用。原创 2023-12-16 13:37:43 · 507 阅读 · 0 评论 -
leetcode LCR 173. 点名
要注意一种特殊情况,当输入的 records = 0,1,2,3,4 时,对应的下标也是 0,1,2,3,4 ,此时下标和值一直都是对应相等的,所以一直都处于左区间,这就会导致当 L 和 R 相遇在数组的最后一个数据 4 上,对应的下标也为 4 ,但我们要填充的是 5 ,所以要判断一下,当 L 和 R 指针相遇时,如果 records[ L ] == L ,就返回 L +1,否则返回 L。缺席的数据是 3 ,我们很容易发现 3 就是右区间左边界的下标,所以我们的目标就是找到右区间的左边界的下标。原创 2023-12-16 10:47:24 · 974 阅读 · 0 评论 -
leetcode 153. 寻找旋转排序数组中的最小值(优质解法)
以 nums = 3,4,5,1,2 为例,用 L 和 R 指针指向数组的两端,mid = left+(right-left)/2= 2 .此时 R 指针指向的刚好是数组的最后一个数据,我们可以顺便记录起来,作为参照值,refer = nums[ R ] = 2。通过题意我们知道,传入的参数是经过旋转的递增数组,如 3,4,5,1,2,就是通过 1,2,3,4,5 旋转得到的,而这种旋转数组的特性我们可以通过一张图清晰的看出来,以 3,4,5,1,2 为例。要获取的答案位于下面区间的左边界。原创 2023-12-14 20:23:30 · 663 阅读 · 0 评论 -
leetcode 162. 寻找峰值(优质解法)
当 nums[i]>nums[i+1]时,i 下标的左边肯定存在一个峰值,因为最左边是 - ∞ ,所以必定需要经历递增,再在 i 这里经历递减,所以必定存在一个峰值,但 i 的右边,可能不会存在峰值,因为可以直接递减到 - ∞,所以我们可以大胆的去除掉 i 右边的数据(i 下标指向的数据不能去除,因为我们不确定 i 是否就是要找的峰值)当 nums[i] < nums[i+1]时,i 下标的右边肯定存在一个峰值,但 i 的左边,可能不会存在峰值,所以我们可以大胆的去除掉 i 左边的数据和 i 的值。原创 2023-12-14 13:55:54 · 736 阅读 · 0 评论 -
leetcode 852. 山脉数组的峰顶索引(优质解法)
通过该划分,我们要找的数据就是递增区间中的右边界,当我们在数组中随机选择一个数 arr[ i ] , 如果 arr[ i ] > arr[ i-1 ] ,就代表该数在递增区间,我们便可以大胆排除该数左边的数据(计算 mid = 3,此时 arr[ mid ] < arr[ mid -1 ],所以 mid 指向的值在递减区间,让 R = mid -1。我们对上述的数组进行分析,我们可以将数组划分为两个区间【1,2,3】是递增区间,【2,1】是递减区间,在图中的划分就是。2. 山脉数组由整数组成。原创 2023-12-14 12:32:52 · 493 阅读 · 0 评论 -
leetcode 69. x 的平方根(优质解法)
我们可以将 0,1,2,3,4 和 0,1,2,3,4,5,6,7,8 这两个区间进行划分,【0,1,2】是i 的平方 x 的区间;比如 x =8 ,我们需要遍历 0,1,2,3,4,5,6,7,8 当 i =2 时,2*2 = 4 < 8,我们向前遍历,当 i = 3 时,3*3 = 9 > 8 ,所以我们得到 2。比如 x = 4,我们需要遍历 0,1,2,3,4,当 i = 2 时,2*2 =4 ,得到结果 2。以 x = 8 为例。原创 2023-12-14 11:49:41 · 1153 阅读 · 0 评论 -
leetcode 35. 搜索插入位置
当 target 的值在数组中不存在时,我们要将 2 放置到 m 指针指向的位置,我们可以看出,m 指针左边的数据都是小于 target 的数据,m 右边的数据都是 >= target 的数据,所以我们可以将数组划分为两个区域【1】是< target 的区域,【3,5,6】是 >= target 的区域,我们要找到的下标便是 >= target 的区域的左边界。我们再次计算中点 mid = 1在< target 区间,所以 mid 指向的数据肯定不会是左边界,所以直接让 L 指针 = mid+1。原创 2023-12-13 16:28:36 · 983 阅读 · 0 评论 -
leetcode 34. 在排序数组中查找元素的第一个和最后一个位置(优质解法)
此时我们想要获取 8 这个数据的起始位置(左边界),我们可以将数组划分为两个部分【5,7,7】【8,8,10】,【5,7,7】的部分是< target 的,【8,8,10】的部分是 >= target 的,我们选取中点 mid = 7 ,7 在 < targe部分,所以 mid 指向的数据肯定不是左边界,于是让 L 指针指向 mid+1 的位置。,简单来说就是,当数据的个数为偶数时,中间节点有两个,如果查找的是左区间,就去左边的节点为中间节点,如果查找的是右区间就取右边的节点为中间节点,为什么呢?原创 2023-12-13 15:10:18 · 1060 阅读 · 0 评论 -
leetcode 76. 最小覆盖子串
L 指针向右移动前,我们需要判断 L 指针指向的字符是否是有效字符,L 指针指向的字符是 A , A 字符在 hash2 中的个数为 1,在 hash1 中的个数为 1,所以该字符 A 是有效字符,在 L 指针移动前需要将 hash2 中的个数减 1 ,即在 hash2 中 A-0,count 减 1 为 2。一种是 L 指针原来指向的字符是有效字符,此时 L 和 R 之间的子串不满足要求,需要 R 指针向右移动,扩大讨论的子串,所以即使 R 指针回到 L 指针的位置,也需要回到现在的位置再向右移动。原创 2023-12-12 17:47:51 · 936 阅读 · 0 评论 -
leetcode 30. 串联所有单词的子串(优质解法)
录入字符串 bar 的信息以后,R 指针向右移动 size 位,录入下一个字符串 foo,将 foo- 1 保存到 hash2 中,由于在hash1 中 foo-1,,所以 foo 是有效字符,此时 count++,count=2,因为此时子串为 barfoo 长度为 6 == size*length ,并且 count == 2 == length,所以该子串是符合要求的,我们就直接记录 L 指针指向的下标 0。将 words 数组中的相关信息保存到哈希表 hash1 中,foo-1,bar-1。原创 2023-12-12 11:53:23 · 1217 阅读 · 0 评论 -
leetcode 438. 找到字符串中所有字母异位词(优质解法)
将 R 指针向右移动,此时子串的长度 right - left + 1 = 4 > p.length,代表以 L 指针指向的字符为首的字符串已经遍历完毕,让 L 指针向右移动,并在 hash2 中将字符 b 对应的 value 值减 1 ,由于字符 c 对应的 value 值为 1 ,小于等于 hash1 中字符 b 对应的 value 值,所以字符 c 是关键字符,在将 L 指针移动以后,要将关键字符数量 count 减 1。count 变量记录当前子串有效字符的个数。原创 2023-12-11 19:18:29 · 1092 阅读 · 0 评论 -
leetcode 904. 水果成篮(优质解法)
首先需要遍历找出符合条件的子数组,让 L 和 R 指针指向下标为 0 的位置,L 和 R 指针之间便是我们当前要讨论的子数组,我们用一个哈希表 fruitNums 来记录篮子里已经装的水果种类和数量,用 count 来记录当前篮子里已经有的水果种类,当 R 指针指向 1 时,我们就需要在哈希表中添加 key =1,value=1 的信息,代表篮子中有 1 个种类为 1 的水果,由于之前哈希表中没有种类 1水果的相关信息,代表篮子中的水果种类增加 1 ,此时 count = 1,记录当前的水果数量 1。原创 2023-12-11 16:47:28 · 1134 阅读 · 0 评论 -
leetcode 1658. 将 x 减到 0 的最小操作数(优质解法)
我们要移除最左边或者最右边的元素,让 x 的值减为 0 ,就相当于,我们要选取最左边或最右边的值,让选取的值相加为 x ,由于我们只从最左或最右边开始选取,这就代表,选取值以后,剩下没有被选取的值是连续的,说明是原数组的一个子数组。我们让指针 L 和 R 指向下标 0 ,L 和 R 指针之间的数据便是我们要讨论的子数组,当 子数组的和小于 target 时,我们让 R ++ ,扩大我们讨论的子数组。),此时以 L 指针为首位的子数组已经讨论完毕,我们让 L++与之前保存的长度进行比较,取较大的保存。原创 2023-12-06 17:51:16 · 1021 阅读 · 0 评论 -
leetcode 1004. 最大连续1的个数 III(优质解法)
答案是不需要,因为 R 指针到达当前位置,0 的个数才增多,子数组才不符合要求,这也代表,R 指针之前的数据都是符合要求的,即使我们让 R 指针回到 L 指针的位置从头开始讨论,R 指针也一定会移动到当前位置,所以没有必要让 R 指针回去,此时 zero =3 不符合要求,我们让 L ++ 直到符合要求为止。当 L 指针移动到当前位置时,zero = 2 = k,符合要求,记录当前讨论的子数组的长度,就可以让 R ++,继续扩大我们讨论的子数组长度。当前长度与之前保存的长度进行比较,取较大的保存。原创 2023-12-05 23:27:40 · 1130 阅读 · 0 评论 -
leetcode 3. 无重复字符的最长子串
该题我们可以采用滑动窗口的方法来解决,对于子数组,字串的题都经常用到滑动窗口的解决方法 题目的要求是:1.要获得最长子串的长度 2.子串中不含有重复字符 我们首先看到题目后可以想到的暴力解法就是,去获取字符串中所有的子串,筛选出不含有重复字符的字串,获取其中最长子串的长度,而滑动窗口方法就是在这基础上进行优化 我们以题目给出的示例 1 来进行说明,输入: s = "abcabcbb",一般遇到输入为字符串的题,通常都需要把字符串转换为字符数组,原创 2023-12-02 15:36:13 · 1075 阅读 · 0 评论 -
leetcode 209. 长度最小的子数组(优质解法)
该题我们可以采用滑动窗口的方法来解决,对于子数组,字串的题都经常用到滑动窗口的解决方法 我们要想获得长度最小的子数组,首先就能够想到一种暴力方法,就是去获取数组中的所有子数组,再进行遍历找到符合条件且长度最小的子数组,而滑动窗口的解决方法是基于该思想实现的,但是进行了优化原创 2023-12-02 13:50:37 · 420 阅读 · 0 评论 -
leetcode 18. 四数之和(优质解法)
题目中有要求,要去除重复的数据,当我们排序以后相同的数据都会靠在一起,我们上一轮已经将 nums[ L ] 为 0 的值获取了,此时 nums[ L ] 依然为 0,即使有符合条件的 nums[ R ] 也是重复的要排除掉,所以当 nums[ L ] == nums[ L-1 ] 时,就直接 L ++ 跳过(在跳过时要注意边界问题),对于 R 指针也是一样的处理,当 nums[ R ] == nums[ R+1 ] 时,就直接 R- - 跳过。的单调性和双指针的方式解决。原创 2023-11-30 11:00:01 · 891 阅读 · 0 评论