105.长度最小的子数组(力扣)|滑动窗口

2023-12-13 08:25:16

代码演示?

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result = INT_MAX; // 用于存储最小子数组的长度
        int sum = 0;          // 滑动窗口的长度
        int i = 0;            // 滑动窗口的起始位置
        int sumlength = 0;    // 当前子数组的长度

        // 遍历数组
        for (int j = 0; j < nums.size(); j++) {
            sum += nums[j]; // 扩展窗口

            // 检查和是否大于等于目标值
            while (sum >= target) {
                sumlength = j - i + 1; // 计算当前子数组的长度
                result = result < sumlength ? result : sumlength; // 更新最小长度
                sum -= nums[i]; // 收缩窗口
                i++;            // 移动窗口的起始位置
            }
        }

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

思路

所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果

  1. 初始化:

    • result 初始化为 INT_MAX,用于存储最小子数组的长度。
    • sum 是滑动窗口中元素的当前和。
    • i 是滑动窗口的起始位置。
    • sumlength 是当前子数组的长度。
  2. 遍历数组:

    • 外部循环 (for (int j = 0; j < nums.size(); j++)) 遍历数组的每个元素。
    • sum += nums[j];:将当前元素添加到滑动窗口的和中。
  3. 检查和是否大于等于目标值:

    • 如果 sum 变得大于或等于 target,表示当前窗口的和足够大。
    • 进入内部的 while 循环来收缩窗口。
  4. 收缩窗口:

    • sumlength = j - i + 1;:计算当前子数组的长度。
    • result = result < sumlength ? result : sumlength;:用目前的最小长度更新 result
    • sum -= nums[i];:从和中减去起始位置的元素。
    • i++;:将窗口的起始位置向右移动。
  5. 返回结果:

    • 循环结束后,如果 result 已经被更新,则返回 result,否则返回 0。

文章来源:https://blog.csdn.net/weixin_63779802/article/details/134867370
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。