209 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
进阶:
如果你已经完成了 O(n) 时间复杂度的解法, 请尝试 O(nlogn) 时间复杂度的解法。
解法
- Python
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
left,right = 0,0
res = 0
minlen = len(nums)+1
while left < len(nums):
if res < s and right<len(nums):
res += nums[right]
right += 1
elif res >= s:
minlen = min(minlen,right-left)
res -= nums[left]
left += 1
else:
left += 1
if minlen == len(nums)+1: return 0
return minlen
- C++
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int left=0,right=0;
int minlen = nums.size()+1;
int res = 0;
while (left<nums.size()){
if (res<s&&right<nums.size()){
res += nums[right];
right ++;
}
else if(res>=s){
if (minlen>(right-left)){
minlen = right-left;
}
res -= nums[left];
left ++;
}
else{
left ++;
}
}
if (minlen==nums.size()+1){
return 0;
}
return minlen;
}
};
- 若改为满足其和=s的长度最小的连续子数组。
def minSubArrayLen(s,nums):
left,right = 0,-1
res = 0
minlen = len(nums)
while left < len(nums):
if right == len(nums) - 1:
res -= nums[left]
left += 1
if res < s and right < len(nums)-1:
right += 1
res += nums[right]
if res > s:
res -= nums[left]
left += 1
if res == s:
minlen = min(minlen,right-left+1)
res -= nums[left]
left += 1
if minlen == len(nums): return 0
return minlen