leetcode 209. 长度最小的子数组

leetcode 209. 长度最小的子数组

大家好,我是小学五年级在读的蒟蒻,专注于后端,一起见证蒟蒻的成长,您的评论与赞与关注是我的最大动力,如有错误还请不吝赐教,万分感谢。一起支持原创吧!纯手打有笔误还望谅解。

题目描述
给定一个含有 n 个正整数的数组和一个正整数 target 。

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

题解一

使用for循环暴力求解

从数组第一个元素开始遍历数组,将每个元素的值相加,若遇到元素大于或等于给定值时则将相加的数组长度与原来已有的长度相比较按长度小的更新值,遍历完毕则判断是否与初始值一样,若不同则返回更新后的值,否则返回0

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result=__INT32_MAX__;
        int arrLength=0;
        int sum;
        for(int i=0;i<nums.size();i++){
            sum=0;
            for(int j=i;j<nums.size();j++){
                sum+=nums[j];
                if(sum>=target){
                    arrLength=j-i+1;
                    result=arrLength>result?result:arrLength;
                    break;
                }
            }
        }
        return result==__INT32_MAX__?0:result;
    }
};

题解二

使用滑动窗口

将数据从首元素就开始相加,如果数据大于或小于给定值,则开始从头递减元素,然后不断更新符合条件的数组长度,最后判断是否长度与初始值一样,不一样返回更新后的值,否则返回0

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result=__INT32_MAX__;
        int arrLength=0;
        int sum=0;
        int j=0;
        for(int i=0;i<nums.size();i++){
           sum+=nums[i];
           while (sum>=target)
           {
               arrLength=i-j+1;
               result=arrLength<result?arrLength:result;
               sum-=nums[j++];
               /* code */
           }
           
        }
        return result==__INT32_MAX__?0:result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学五年级在读的蒟蒻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值