209-最小数组长度
leetcode题解——最小数组长度
题目如下
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
解题思路
- 用滑动窗口的思想,当窗口内的值大于target时,就让窗口往前滑动,使窗口内的值始终是<=target的。
- 我的想法是用两个变量i,j来使窗口滑动
- 当窗口内的值小于target时,i向前走
- 当窗口内的值小于target时,j向前走
- 当窗口内的值等于target时,更新此时的最小数组长度
- 若i,j还未遍历到数组尾部时,将滑动窗口整个向前滑动一格
- 然后这个想法。。。死循环了吧好像。。。
//超出时间限制的解法,正确与否尚待考究
int min_num(int a, int b){
if(a>b){
return b;
}else{
return a;
}
}
int minSubArrayLen(int target, int* nums, int numsSize){
int i=0, j=0;
int sum=nums[0];
int min=numsSize;
while(i<numsSize){
if(sum<target){
i++;
sum+=nums[i];
}else if(sum>target){
sum-=nums[j];
j++;
}else{
min=min_num(i-j+1, min);
if(i<numsSize-1 && j<numsSize-1){
i++;
j++;
sum=sum-nums[j-1]+nums[i];
}
}
}
if(sum==target){
return min;
}else{
return 0;
}
}
正确解法:
int minSubArrayLen(int target, int* nums, int numsSize){
int min=numsSize+1;
int sum=0;
int i=0;
for(int j=0;j<numsSize;j++){
sum+=nums[j];
while(sum>=target){
min=min>(j-i+1)? (j-i+1):min;
sum-=nums[i];
i++;
}
}
if(min<numsSize+1){
return min;
}else{
return 0;
}
}

浙公网安备 33010602011771号