题目
Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn’t one, return 0 instead.
给定一个长度为n的正整数数组,以及一个正整数s,找到其和不小于s的最短的子数组,并返回其长度。如果不存在,返回0。
思路
首先分析问题,要求满足子数组之和>=s的所有子数组中,长度最小的一个。
所以首先要保证的是其和大于等于s。
定义变量left,right,分别表示子数组的起始和终止下标。
用变量sum记录从下标left到当前下标的元素之和,并与s比较,如果大于s,则尝试将left右移,并查看是否需要更新长度最小值。
题解
class Solution {
public int minSubArrayLen(int s, int[] nums) {
int len = nums.length;
int min = len+1;
int sum=0;
int left=0,right=0;
for(int i=left;i<len;i++){
sum+=nums[i];
if(sum>=s){
right=i;
while(sum-nums[left]>=s){
sum-=nums[left];
left++;
}
if(right-left+1<min)
min = right-left+1;
}
}
return min>len?0:min;
}
}
反思
复杂度分析
时间复杂度:O(n2)
空间复杂度:O(1)