leetcode——数组:滑动窗口

139 阅读4分钟

长度最小的子数组

题目209

给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,
并返回其长度。如果不存在符合条件的子数组,返回 0
输入: target = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的子数组。

个人思路:想着先用指针按数组循环,找出每一个连续子数组,然后计算每一个子数组的和,比较记录。 就是暴力解法,双指针。
互动窗口解法: 所谓滑动窗口也可以理解为双指针法的一种,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。 这里还是以题目中的示例来举例,s=7, 数组是 2,3,1,2,4,3,来看一下查找的过程. image.png 个人理解就是left固定为0,right先移动,确定一个滑动窗口。当这个滑动窗口的整体值大于等于target的时候,开始移动lef,用窗口值继续和targrt比较,result=min(result,right-left+1).

题904

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组fruits表示,其中 fruits[i]是第i棵树上的水果 种类 。
你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:
你只有两个篮子,并且每个篮子只能装单一类型的水果。每个篮子能够装的水果总量没有限制。
你可以选择任意一棵树开始采摘,你必须从每棵树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。
给你一个整数数组 fruits ,返回你可以收集的水果的最大数目。

题目意思就是:你自己选从哪开始把数字放入数组中,放入连续两个数字后,从选择位置向后找遇到不同的就结束。
个人思路:滑动窗口,left先指向0位置,right去指向和0不同的位置,记住第一个不同的位置,right找到与这两个都不同元素的位置,记住窗口大小。开始下一轮。
代码我是想着先找和第一个元素不同的位置,然后把元素放进数组,根据这个位置继续遍历找和前两个元素不同的位置

正确思路: 用滑动窗口遍历fruits,当有新种类的水果进入窗口时
如果窗口中只有一种水果,将这种水果加入arr数组
如果有两种水果,更新窗口的左边界,更新arr中水果的种类
如果进来了一种新的类型的水果 更新前一种水果的位置
更新滑动窗口的最大值

题76

给你一个字符串 `s` 、一个字符串 `t` 。返回 `s` 中涵盖 `t` 所有字符的最小子串。
如果 `s` 中不存在涵盖 `t` 所有字符的子串,则返回空字符串 `""` 。

总思路和第一个思路一样,无限扩大right指针直到包含need所有单词,然后开始增大left来缩小窗口。
第一步创建两个对字典,字典need和字典window。
第二步移动right元素,判断此时指针指向的元素是否在need字典中,如果在就在对应window字典中把这个元素key的value加1,并且判断window[c]是否等于need[c]表明这个c元素是否都找好了,找好了valid+1。
第三步:当valid===Object.keys(need).length就表示元素全部包含了,要开始移动left指针。看left现在指向的元素,left++,判断这个元素是不是need里面的元素,如果是就说明不能移动,如果你移动了就需要在现在window窗口里减少这个元素的vlue并且valid-1。

这题用对象做别用map字典做。主要是js中map的key个数不知道怎么返回
问题解决:map使用map.size