0
点赞
收藏
分享

微信扫一扫

209. Minimum Size Subarray Sum(很重要)

独西楼Q 2022-12-02 阅读 75


n positive integers and a positive integer s, find the minimal length of a subarray of which the sum ≥ s. If there isn't one, return 0 instead.

​[2,3,1,2,4,3]​​ and ​​s = 7​​,

the subarray ​​[4,3]​

​​click to show more practice.​​


More practice:

If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log n).

1.方法一

left和right最初都指向0; right右移直到sum>=s;再右移left直到sum<s,之间更新res;重复上述两个过程。

时间复杂度O(n)。

class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int left=0,right=0;
int len=nums.size();
int res=len+1;
int sum=0;
while(right<len){
while(right<len&&sum<s){
sum+=nums[right];
right++;
}
while(sum>=s){
sum-=nums[left];
left++;
res=min(res,right-left+1);
}
}
return res==len+1?0:res;
}
};


2,方法2


class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int len=nums.size();
if(len==0) return 0;
vector<int> sums(len,0);
sums[0]=nums[0];
for(int i=1;i<len;i++){
sums[i]=sums[i-1]+nums[i];
}

int res=len+1;

for(int i=0;i<len;i++){
int end=helper(i,sums,s);
res=min(res,end-i+1);
}
return res==len+1?0:res;
}
private:
int helper(int start,vector<int>& sums,int s){
int left=start,right=sums.size()-1;
int offset=start==0?0:sums[start-1];
while(left<=right){
int mid=left+(right-left)/2;
int sum=sums[mid]-offset;
if(sum>=s){
right=mid-1;
}else{
left=mid+1;
}
}
return left;
}
};




举报

相关推荐

0 条评论