一、题目描述
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其和大于等于 target
的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 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
二、题解
通过双指针来标识一个窗口,当窗口内数据和小于 target
时需要将后指针后移以增大数据和,当数据和小于等于 target
时需要将前指针后移以增大数据和了。时间复杂度
O
(
n
)
O(n)
O(n),空间复杂度
O
(
1
)
O(1)
O(1):
class Solution {
public:
int minSubArrayLen(int target, vector<int> &nums) {
int win_begin = 0, win_len = 0; // 滑动窗口起始位置和长度
int win_sum = 0; // 滑动窗口中的数据的和
int ret = nums.size() + 1; // 返回值
for (int win_end = 0; win_end < nums.size(); win_end++) {
win_sum += nums.at(win_end);
while (win_sum >= target) {
win_len = win_end - win_begin + 1;
ret = min(ret, win_len);
win_sum -= nums.at(win_begin); // 滑动窗口
win_begin++;
}
}
return (ret == nums.size() + 1) ? 0 : ret;
}
};