自学内容网 自学内容网

滑动窗口(五)、长度最小的子数组

209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target

找出该数组中满足其总和大于等于 target 的长度最小的

子数组

  [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度 如果不存在符合条件的子数组,返回 0

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

 利用滑动窗口的思想,对该数组进行访问,左右指针卡出一个滑动区间,由于是一个正整数序列,所以right加入一个数这个区间肯定变大,left少一个数肯定会变小,里面这个单调性质来和target作比较,每次维护一个数组的最小长度即可。

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int left = 0, right = 0, sum = 0;
        int n = nums.size();
        int ret = INT_MAX;  // 出错点2、对于INT_MAX的使用,刚开始将ret最大值定义为数组长度,忽略了示例三情况
        while(right < n)
        {
            // sum += nums[right++] 出错点1,提前对right进行了++操作,导致下面访问出错
            sum += nums[right];  
            while(sum >= target)
            {
                ret = min(ret, right-left+1);
                sum -= nums[left++];
            }
            right++;        // 应该在访问right完成之后进行++
        }
        return ret == INT_MAX ? 0 : ret; 
    }
};


原文地址:https://blog.csdn.net/weixin_66151870/article/details/144028388

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!