题目:209. 长度最小的子数组
思路:双指针,时间复杂度0(n)。
sum记录左右指针内的数组元素之和,当sum-nums[left]>=target时,移动左指针。
C++版本:
cpp
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n=nums.size();
int mn=n+1;
int sum=0;
for(int left=0,right=0;right<n;right++){
sum+=nums[right];
while(sum-nums[left]>=target){
sum-=nums[left];
left++;
}
if(sum>=target){
mn=min(mn,right-left+1);
}
}
return mn==n+1 ? 0:mn;
}
};
JAVA版本:
java
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int n=nums.length;
int mn=n+1;
int sum=0;
for(int left=0,right=0;right<n;right++){
sum+=nums[right];
while(sum-nums[left]>=target){
sum-=nums[left];
left++;
}
if(sum>=target){
mn=Math.min(mn,right-left+1);
}
}
return mn==n+1 ? 0:mn;
}
}
GO版本:
go
func minSubArrayLen(target int, nums []int) int {
n:=len(nums)
sum,mn:=0,n+1
for left,right:=0,0;right<n;right++ {
sum+=nums[right]
for sum-nums[left]>=target {
sum-=nums[left]
left++
}
if sum>=target {
mn=min(mn,right-left+1)
}
}
if mn==n+1 {
return 0
}
return mn
}