Day4 代码随想录打卡|数组篇---长度最小的子数组

题目:

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

找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

方法:滑动窗口法

思路:什么是滑动窗口法?

滑动窗口就是利用两个指针,两个指针之间的就是一个窗口,窗口内存放的是满足条件的长度最小的连续子数组。首先将两个指针都放在数组起始的位置,然后后面的指针往后移动,当满足窗口内的元素和>=target时停止并保存当前窗口的长度与前一个窗口的长度作比较,保留最小的值。最后当全部遍历完时,保留的就是长度最小的子数组的长度。需要注意的是一个for循环中的变量表示的是子数组终止的位置而不是起始的位置。

关于如何保存长度最小的子数组的长度。首先定义result=INT32_MAX(表示32位整数所能表示的最大整数),其次利用result=result<len?result:len,保存最小的长度。原理是刚开始result被定义为了最大的数,所第一次循环中result不可能小于len,从而result被赋值为了第一个满足条件的子数组的长度。往后每次循环,有更小的长度时就会被赋值给result直到结束。

题解:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result = INT32_MAX;                   //定义result为最大的整数
        int len = 0;
        int sum = 0;
        int i = 0;
        for (int j = 0; j < nums.size(); j++){    //表示窗口的终止位置
            sum += nums[j];
            while(sum >= target){
                len = (j - i) + 1;
                result = result < len ? result : len;
                sum -= nums[i++];                 //当有满足条件的子数组出现时,移动起始位置
            }
        }
        return result == INT32_MAX ? 0 : result;
        }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值