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;
    }
}

posted @ 2021-03-09 20:16  平平无奇的打工人  阅读(116)  评论(0)    收藏  举报