暴力解法:
像这种暴力解法就是穷举法,将所有的可能都枚举出来,在这过程中,将最小的长度找出来
int minSubArrayLen(int target, int* nums, int numsSize) {
int i,j;
int length = 0;
int sum = 0;
int result = INT_MAX;;
for(i = 0; i < numsSize; i++){
sum = 0;
for(j = i; j < numsSize; j++){
sum += nums[j];
if(sum >= target){
length = j - i + 1;
result = result < length ? result : length;
break;
}
}
}
return result == INT_MAX ? 0 :result;
}
但是暴力解法呢,是通过不了的,它超时了。
双指针(滑动窗口)
我们可以将这个子数组看成一个区间,暴力解法就是固定一端,然后另外一边不断的扩大,那如果我们可以同时控制两端,是不是可以达到减少时间呢?
当我这个区间的和大于目标,那么就收缩左端,直至小于目标值,然后,右端直接扩大,右端到达数组边界时,便停止循环
int minSubArrayLen(int target, int* nums, int numsSize){
//初始化最小长度为INT_MAX
int minLength = INT_MAX;
int sum = 0;
int left = 0, right = 0;
//右边界向右扩展
for(; right < numsSize; ++right) {
sum += nums[right];
//当sum的值大于等于target时,保存长度,并且收缩左边界
while(sum >= target) {
int subLength = right - left + 1;
minLength = minLength < subLength ? minLength : subLength;
sum -= nums[left++];
}
}
//若minLength不为INT_MAX,则返回minLnegth
return minLength == INT_MAX ? 0 : minLength;
}