Algorithm
文章平均质量分 76
个人在算法学习之路上的总结与分享,有很多例题和思路,期待与大家一同探索算法的奥秘。
-指短琴长-
小趴菜
展开
-
滑动窗口_将x减到0的最小操作数_C++
就本题来讲,如果我们直接从正面去写,减减数组左边,减减数组右边,将会非常非常麻烦,有非常多的情况需要考虑。这里我们来学习一个思路,如果问题从正面难以解决,我们就尝试从反面入手。如果是等于,就更新结果,然后出窗口;如果是大于,那就不更新结果,直接出窗口。中间的那段区域,它是一段连续的区域,它满足的条件是:长度等于数组总长度减去。将正面问题转化:找出最长的子数组的长度,所有元素的和正好等于。如图,线段表示一个数组,正面做的思路就是,找到两个区间。后,再停止出窗口操作。,此时,终止进窗口的操作,开始判断。原创 2023-11-01 21:24:26 · 71 阅读 · 0 评论 -
滑动窗口_最大连续1的个数|||_C++
输入:nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3。输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2。的值已经为2了,且当前位置的值是0,说明已经找到了一个结果,记录这个结果。,接着以下标为1的位置为起始位置,再遍历一次,就这样,遍历出最终结果。这时,我们的思路就是,跳过这串连续的0。指针从前三个1的那一个1开始遍历,都没有第一个1的结果大,解释:[1,1,1,0,0,,遇到1直接跳过,遇到0就让。原创 2023-10-31 23:03:14 · 45 阅读 · 0 评论 -
滑动窗口_无重复字符的最长子串_C++
本题中,我们选择使用一个数组来模拟哈希表,原理是利用了字符的唯一性。每一个英文字符,都有一个唯一对应的ASCII码值。我们让这个ASCII码值作为哈希表的下标,来实现一一对应。给定一个字符串 s ,请你找出其中不含有重复字符的 最长连续子字符串 的长度。我们要用哈希表中对应位置的值,作为判断条件,一旦有位置的值大于。,从哈希表中删除该字符。了,就说命元素出现了重复,就需要进行出窗口的操作。如果窗口内出现重复字符,就出窗口,让。位置的值,就对应当前窗口中字符。,那么对应哈希表中的元素就是。原创 2023-10-31 17:01:35 · 48 阅读 · 0 评论 -
滑动窗口_长度最小的子数组_C++
所以如果选出一个子数组,它已经满足条件了,那么再向其中增加元素,数组的总和一定是增大或者不变的,那就没必要再向子数组中增加元素了。但是,我们考虑了所有的情况,只是把很多不合适的数组提前舍弃了,规避了很多没有必要的枚举行为,所以是正确的。而这种双指针的优化写法,省去了遍历子数组求和的操作,使得时间复杂度直接降低了一维,只有两个指针不断遍历的时间复杂度,为。,再向子数组中增加新的元素,它的结果一定是满足条件的,但是长度会变长,最后也一定不是我们想要的长度最小的子数组。,对这个区间求和,需要遍历一遍数组,是。原创 2023-10-26 00:10:30 · 284 阅读 · 1 评论 -
双指针_四数之和_C++
2)在b后面的区间内,利用 “双指针” 找到两个数,使这两个数的和等于。,会有数据溢出的风险,因为有一组很大的测试数据,范围超过了。请你找出并返回满足下述全部条件且不重复的四元组。注意:在leedcode中,本题。1)依次固定一个数 b。这段代码,如果不使用。原创 2023-10-25 12:40:16 · 48 阅读 · 1 评论 -
双指针_盛水最多的容器_C++
先固定最左边的数据1,依次和后面的数据结合,找出一个容积最大值。由图我们可以看出,一个容器的容积和两个竖板的高度还有两个板子之间的距离有关,而最多能盛的水有多高,取决于最低的那个板子有多高。以此类推,计算出很多小的容积,再把这些小的容积拿出来对比,找出一个最大容积。2)里面这块板子比较大,高度不变,还是4,宽度减小,容积必然也是减小的。1)里面这块板子比较小,那么宽度减小,高度也减小,容积必然是减小的。然后再舍去较小的板子1,去研究8和7组成的容积,记为。,然后大胆的舍弃板子4,继而去研究6和5的容积。原创 2023-10-24 23:51:24 · 40 阅读 · 0 评论 -
双指针_和为s的两个数_C++
如图,2和21相加为23,小于30,那么2和21中间的那一堆数还有必要和2相加吗?答案是没有必要,因为数组是单调递增的,所以2和中间那一堆数相加结果一定小于目标值30。条件不成立,那么这个函数是永远没有返回值结果的,所以我们在该函数的最后再随便返回点什么东西就行了,当然这句代码也是没有执行的机会的。为例,依次让2+7,2+11,2+15,…,然后让7+11,7+15,7+19,…题目要求,输出一个可能的结果即可。这个结果以数组的形式输出,元素的顺序无所谓。因为它没有利用题中数组的一个特性,数组是有序的。原创 2023-10-24 22:59:18 · 43 阅读 · 0 评论 -
双指针_三数之和_C++
其中,双指针算法可以在暴力解法的基础上,将时间复杂度直接降低一维。向后移动一位,指向的元素还是-4,又要重复之前的搜索过程,得到的结果和之前的结果重复,需要去重。,但是这个结果和之前的结果重复,需要去重,所以直接让指针跳过这些重复的元素就可以了。先把数组进行一次排序,这样就不用对结果一一排序了,仅需一次大的排序即可。指向第一个元素-4,固定这个数,然后用双指针在这个数后面的区间内搜索。是相同的三元组,因为其中的元素是相同的,元素的顺序不重要。找到一种结果之后,指针不要停,缩小区间,继续寻找。原创 2023-10-24 17:32:47 · 189 阅读 · 0 评论 -
双指针_移动零_C++
实际上是把数组分割成了两个空间,前一块是处理过的数据,后一块是没有处理过的数据;解决这类题,我们采用双指针算法(不是真的使用指针,是利用数组下标来充当指针)实际上是把已经处理过的小空间又划分出两块来,前一块是非0数据,后一块是0。,编写一个函数将所有0移到数组的末尾,同时保持非零元素的相对顺序。就本题而言,是将一个数组划分成非0的一段,和是0的一段。:指向已处理的区间内,非零元素的最后一个位置。时数组已经遍历完了,相当于数组已经处理完了。1)刚开始,处理过的区间不存在,先让。:从左往右扫描数组,遍历数组。原创 2023-10-20 23:18:49 · 83 阅读 · 1 评论