题目链接
英文链接:https://leetcode.com/problems/minimum-size-subarray-sum/
中文链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum/
题目详述
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
示例:
1 | 输入: s = 7, nums = [2,3,1,2,4,3] |
进阶:
如果你已经完成了O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。
题目详解
- 运用双指针
l
和r
。 l
指向连续子数组的左边界,r
指向连续子数组的右边界的下一个位置,即[l, r)
为可能的连续子数组。- 每次移动
r
直至满足条件,然后更新最结果,使l
右移,直至区间[l, r)
不再满足条件。 - 重复这个过程,继续移动直至结束。
- 时间复杂度为 O(n)。
- 空间复杂度为 O(1)。
1 | public class LeetCode_00209 { |
进阶要求 O(n log n) 时间复杂度的解法,可以运用二分查找。
- 首先新建一个数组
sum
,用来记录数组nums
的前缀数组和。 - 遍历
sum
,对每一个位置i
,在数组sum
中找到大于等于sum[i - 1] + s
的第一个位置index
。 - 若存在表明找到一个可能的区间
[i, index]
,并更新结果。 - 时间复杂度为 O(n)。
- 空间复杂度为 O(nlogn)。
1 | public class LeetCode_00209 { |