题目描述
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
- 输入:s = 7, nums = [2,3,1,2,4,3]
- 输出:2
- 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
提示:
- 1 <= target <= 10^9
- 1 <= nums.length <= 10^5
- 1 <= nums[i] <= 10^5
思路
这道题目暴力解法当然是 两个for循环,然后不断的寻找符合条件的连续子序列,时间复杂度很明显会达到O(n^2),那有没有更快的解法呢?其实,这是一道典型的滑动窗口类型的经典例题,核心还是利用双指针,维护一左一右两个指针,两指针之间可看成一个窗口,不断扩大窗口,满足条件之后再逐步缩小窗口,直到遍历结束。
解法
C++版本
Java版本
Python3版本
ps:不要以为while循环里再放一个while循环就以为是O(n^2)啊,其实是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。