题解
最短连续子数组和大于target,这个限制非常强,以至于可以利用该性质,
在O(n)内完成判断。
详细见第一篇代码。
第二篇可改进为O(nlog(n)),利用前缀和数组递增性。
Code
O(n)
int minSubArrayLen(int s, vector<int>& nums) {
int n = nums.size(), start = 0, sum = 0, minlen = INT_MAX;
for (int i = 0; i < n; i++) {
sum += nums[i];
while (sum >= s) {
minlen = min(minlen, i - start + 1);
sum -= nums[start++];
}
}
return minlen == INT_MAX ? 0 : minlen;
}
拙作留念 O(n^2)
int minSubArrayLen(int s, vector<int>& nums) {
int n = nums.size();
vector<int> pre(n+1,0);
for(int i=1;i<=n;i++){
pre[i]=pre[i-1]+nums[i-1];
}
int min_l = n+1;
for(int i=n;i>=1;i--){
for(int j=0;j<i;j++){
if(pre[i]-pre[j]>=s && i-j<=min_l){
min_l=min(min_l,i-j);
}
}
}
return min_l==n+1? 0:min_l;
}