算法刷题笔记
文章平均质量分 59
一起学习算法吧
gugugu.
励志将编程讲的通俗易懂,和大家一起拿大offer!!!!!!
博客写的好,offer拿到饱!!!!!
展开
-
18.求三数之和
不妨将target固定位最大值,将需要的两个数在target的左边区间进行寻找,即在小于target的范围里寻找,这时利用双指针,记作left,right,从两侧向中间逼近即可。,所以,我们可以在找到了符合要求的三元组后,跳过相同元素再继续寻找,这样,就可以避免重复的三元组。这道题目有一点很坑的地方,题目中target是int类型,但是四数之和有可能是超过int类型的范围的,需要强转。我们先固定一个数,记作target,则只需要寻找两个数,使这两个数的和为负target即可。符合要求,保存下来,继续寻找,原创 2024-09-04 21:04:51 · 487 阅读 · 0 评论 -
1658.将x减到0的最小操作数
题目要求从最左边或者最右边移除元素,需要思考两侧,这是比较麻烦的。3、最后的返回值,要用size - len,别直接返回len。1、可能原数组的和 <= x,这是要进行特殊判断的。2、确定好如何进窗口,判断,出窗口,更新结果。很明显,使用滑动窗口可以很快速的解决这道题。区间,所以,这个题目可以转化成寻找一个。,使得子数组的和为原数组的和减去x。一下,最后剩余的元素是不是中间的。原创 2024-09-08 20:11:30 · 370 阅读 · 0 评论 -
611.有效三角形的个数
设置left和right两个指针,left指向左边,right指向距离大边最近的一条边,依次向中间汇合,进行调整,即可得到答案。但是,如果已知三条边的大小关系,只需要两条较小边的和大于第三条边即可。则,所有left右边的边都可以和right和target构成三角形,则,所有right左边的边都不能喝left和target构成三角形。所以,我们需要首先进行排序来获取不同边的大小关系。left++继续寻找该target下的有效三角形。我们如何寻找两条较小边和一条大边呢?不妨先固定一条大边,移动两条小边。原创 2024-09-03 18:50:20 · 400 阅读 · 0 评论 -
946.验证栈序列
我们知道一个栈的一种入栈顺序可能对应多种出栈顺序,让我们肉眼来判断一下,还是很容易判断出来是不是正确的出栈顺序,那么如何用代码来实现呢?pushed走完了之后,去查看s是否为空,如果s为空,说明匹配上了,否则,不匹配。先把pushed进一个栈s,然后比较s.top 与 popped[i],++i后再与s.top继续比较,直到不相等跳出循环。如果相等,就s.pop,同时++i;如果不相等,就继续将pushed入栈。OK,先掏一个栈s出来再说。原创 2024-09-09 19:52:31 · 273 阅读 · 0 评论 -
209.长度最小的子数组
随着left和right的移动,left和right之间就夹出了窗口。进窗口,判断,出窗口,以及更新结果,更新结果的步骤根据不同的情景有不同的变化,前三个步骤一般都会有。首先,子数组是连续的,第二,所有的元素都是正整数,所以子数组的和具有单调性。可以通过++left来缩小窗口(出窗口),直到sum < target。说明和太小了,需要继续扩大窗口,于是right++,继续处理(进窗口)我们再设置一个sum变量,来统计窗口之间的和的大小。和的大小达到了要求,这时候就需要去寻找最小的窗口。原创 2024-09-05 20:35:56 · 334 阅读 · 0 评论 -
438.找到字符串中所有字母异位词
注意,这里hash表里面仅仅存的是字符,总共26个小写字母,直接遍历一遍出结果就可以,还是很好比较的,但是,如果存的不是字符呢?出窗口前,发现hash2[left] == 2 > hash1[left],那么说明出的这个元素是无效元素,count不需要改变。开始 hash2[s[right]] 进入hash表后,1 <= hash1[c],那么这就是有效元素,count++下一次出窗口时,发现hash2[c] <= hash1[c],诶,就是有效元素了,count–这是再遍历hash去比较,比较的麻烦。原创 2024-09-10 18:39:28 · 999 阅读 · 0 评论 -
3、无重复字符的最长子串
注意,在出窗口的时候,需要删除重复字符前面的字符,否则,这些字符,在后面新子串里面也会被当做重复字符。当hash表里面没出现right字符时,就插入hash表,right++,增加子串的长度。当hash表里面right字符出现的次数不是大于1的时候,就出现了重复,需要出窗口了。为了去判断窗口里面有没有出现重复的子串,可以使用一个hash表来存出现的次数,这时,我们将left移到重复字符的下一个位置,继续寻找更长的子串。子串是连续的,很容易联想到滑动窗口,处理连续子串问题很方便。记录下此时子串的长度。原创 2024-09-05 20:50:55 · 505 阅读 · 0 评论 -
102.二叉树的层序遍历
单纯层序遍历使用队列就可以了,每次出队列的时候,进行输出,并将该元素的left和right入队列即可。二叉树的单纯层序遍历还是很简单的,但是这个题,要求我们将返回值按层写到一个二维数组中,该如何实现呢?经过观察,可以发现,每一次删完一层的元素之后,队列里面剩余的元素个数就是下一层的元素个数。解决完关键问题之后就比较简单了,套上一般层序遍历的代码来写即可。我们可以设置一个变量来记录每一层的元素个数。再来一个queue存每一个元素的层数。在这个题目中,问题在于,原创 2024-09-09 20:08:36 · 269 阅读 · 0 评论 -
147.最小栈
mins.top一定是最小元素,所以s.top 不可能 < mins.top。其中一个栈s实现栈的基本功能,另一个栈mins实现检索最小元素的功能。在每一次入栈的时候,都将该元素x与mins栈的栈顶元素top相比较。注意这里要加上等号,因为,可能会有多个最小的元素,比如出现多个0等。这道题目做起来还是比较简单的,使用两个栈就可以实现题目要求。来看一下怎么样实现检索最小元素的功能呢?x入mins栈,此时x也就成了最小的元素。将s.top 与mins.top进行比较。也就是最小元素,此时两个栈同时pop。原创 2024-09-09 19:37:08 · 518 阅读 · 0 评论 -
904.水果成篮
出窗口:hash[left]–的同时,要去判断是否hash[left] == 0,如果等于0,删除该元素即可。更新结果,ret = max(ret,right - left + 1),使得这个子数组里面最多存在两种不同的数字,很容易联想到使用滑动窗口。另外,需要使用hash表来记录区间内的不同种水果的个数。判断:哈希表的size > 2,就需要出窗口。读完题目,很明显,这个题目需要我们寻找一个。首先还是left,right = 0;进窗口:right进哈希表。原创 2024-09-08 20:23:05 · 344 阅读 · 0 评论 -
1004、最大连续1的个数III
当0的个数大于k时,就需要出窗口了,记录下此时的长度,需要将left跳过一个0,继续寻找新的窗口。该题,最大的难点在于,如何将“翻转最多k个0”转换成比较好做题的语言,当0的个数小于等于k时,可以继续扩大窗口,right++;还是设置left和right两个指针,从0开始移动,另外设置一个变量zero来统计窗口内0的个数,与下面这个题很像,就不详细解释了。这样的话,就更好理解了。原创 2024-09-05 21:09:47 · 339 阅读 · 0 评论