算法题5 3/8 #滑动窗口专题开始#209 长度最小的子数组

https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-dong-chuang-kou-by-powcai/

网友整理的滑动窗口专题,这周可以专攻一下

209. 长度最小的子数组

题目描述:

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。


示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]

输出:2

解释:子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2:

输入:target = 4, nums = [1,4,4]

输出:1

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]

输出:0

这道题是似曾相识的滑动窗格,只不过我们现在窗格的要求是各个数字加起来的和》=目标数字

思路:

case1:

具体代码如下,但是超出了运行时间。。。

还是讲一下我的思路

如果要找最小的组合,那么就要有一个左边的指针遍历每一个元素,然后从指针所指元素开始,把后面的元素append到result_list里面,直到找出sum大于等于target的数组,然后把这个数组的长度跟min_len相比较,找出最小值,这个方法需要用到两重循环解决

时间超了,想办法优化:

看了的官网第三种解答方法,才觉得自己并没有完全理解滑动窗口法

https://leetcode-cn.com/problems/minimum-size-subarray-sum/solution/chang-du-zui-xiao-de-zi-shu-zu-by-leetcode-solutio/

这个网友的解释我觉得很好理解,以后也可以尝试把复杂的逻辑想象成生活里的事物来理解,这里稍微引用一下:

“看逻辑累的同学,可以尝试从贪吃蛇的角度去考虑这个问题。一直吃前面的方块,直到长度符合最小要求,这时我们不可能去掉头部方块,因为没吃它之前长度不够,然后为了减肥,我们只能考虑去减掉后面的方块。 减完一阵子之后,蛇蛇还想知道怎么才能更瘦,那肯定是看前面有没有更大的方块进来,以便我们排出更多小方块。所以需要继续边吃边吐的过程。”

代码如下:


其实官网还有一种解法,今天吃完晚饭之后再来更,写数学去啦啦啦啦

你可能感兴趣的:(算法题5 3/8 #滑动窗口专题开始#209 长度最小的子数组)