【算法】滑动窗口破解长度最小子数组

本文解析了如何解决209题中的最小连续子数组长度问题,介绍了暴力枚举的O(n^2)方法和利用单调性改进的滑动窗口O(n)算法。通过实例和代码展示了优化思路和复杂度分析。

在这里插入图片描述

Problem: 209. 长度最小的子数组

题意分析

首先来分析一下本题的题目意思

  • 题目中会给到一个数组,我们的目的是找出在这个数组中 长度最小的【连续】子数组,而且要返回这个子数组的长度

1.jpg

  • 那我们首先来看示例1,在所找出的所有连续的子数组后,我们需要去比较谁的长度比较短一些,然后去选择短一些的这个子数组

2.jpg

  • 下面们我们看这个示例3,其最后的返回长度为0,原因就在于给出的整型数组中所有数之和还是没有超过target,所以呢就返回了0

3.jpg

💬 但是要如何去寻找这个最小的子数组呢,我们马上来揭晓🖐

算法原理讲解

我们通过分析此题的算法原理来看看该如何去进行求解

暴力枚举O(N^2)

首先第一种,还是我们最熟悉的暴力解法

  • 不过也是要使用到双指针的,我们从0的位置开始向后遍历

4.jpg

5.jpg

6.jpg

7.jpg

  • 好,通过上面的这个图示,我们可以清晰地看出经过right的不断后移中,我们发现了一组长度> target的数据。但是呢我们这里使用的是【暴力枚举】,所以此时还会继续向后进行遍历操作→

可以观察到,当这个right继续后移将所遍历到的数加到sum上去的时候,虽然sum的大小是比target来得大了,但是呢这个len 的长度也相对应地发生可增长,这个其实的话就不对了,因为题目中所要求我们的是求解 最小子数组的长度

8.jpg

利用单调性,滑动窗口求解

看了上面的部分思路后,确实觉得暴力解法不可行,所以我接下去会使用【滑动窗口】的思想去做一个优化的操作

  • 我们可以将left向后移动一位,此时子数组的和即为当前的sum减去left刚刚所指位置的那个数,即为【6】,那么我们在计算整个子数组的和时就可以不用让
评论 20
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烽起黎明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值