leetcode209. 长度最小的子数组(滑动窗口)

这篇博客介绍了如何使用滑动窗口算法来高效地解决寻找数组中连续子数组最小和的问题,对比了滑动窗口解法和暴力解法,其中滑动窗口解法在效率上更优,避免了超时情况。代码实现详细展示了算法的逻辑和窗口的移动过程。
摘要由CSDN通过智能技术生成

一:题目

在这里插入图片描述

二:上码

class Solution {
public:
    /**
        思路:
            1.滑动窗口解法
                1>:确定窗口内是什么
                2>:确定窗口的起始位置
                3>:确定窗口的终止位置

            2.窗口:也就是我们的求的连续字符串的和
            3.窗口的起始位置: 窗口的起始位置最先是我们数组的起始位置,当窗口内连续数组的和大于target的时候,    
                             起始位置就需要往前移动来缩小我们窗口的大小
            4.窗口的终止位置: 窗口的终止位置就是我们的数组的下标


    */
    int minSubArrayLen(int target, vector<int>& nums) {

        int i = 0;//起始位置
        int length = 0;//窗口的大小
        int ans = INT_MAX;
        int sum = 0;

        for (int j = 0; j < nums.size(); j++) {
            sum += nums[j];

            while (sum >= target) {//要开始移动我们窗口的起始位置
                length = (j-i+1);//这里加一是因为 我们的j是从0开始的
                ans = ans > length ?length :ans;
        
                //开始缩小我们的窗口
                sum -= nums[i++];

            }            

        }        

        return ans == INT_MAX ? 0 : ans;
    }
};

// class Solution {
// public:
//     /**
//         思路:
//             1.暴力解法
//                 两层for循环,记录下来 >=target 的字符串长度。    
//             2.超时   
//     */
//     int minSubArrayLen(int target, vector<int>& nums) {

//             int length = nums.size();
//             int ans = INT_MAX;

//             for (int i = 0; i < length; i++) {
//                  vector<int> v;
//                 for (int j = i; j < nums.size(); j++) {
//                     v.push_back(nums[j]);
//                     int sum = accumulate(v.begin(),v.end(),0);
//                     if(sum >= target) {
//                         if (ans > v.size()) {
//                             ans = v.size();
//                         } else {
//                             break;
//                         }
//                     }

//                 }
//             }

//             if(ans == INT_MAX) return 0;

//             return ans;
//     }
// };





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天天向上的菜鸡杰!!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值