C++代码随想录刷题知识分享-----长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

示例:

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

提示:

  • 1 <= target <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^5

✅ 正确思路:滑动窗口 + 当前窗口和变量

我们可以用一个变量 windowSum维护当前窗口 [i, j] 的和,只在指针移动时更新它,这样每个元素只被访问一次,时间复杂度变成 O(n)

class Solution {
public:
    int minSubArrayLen(int target, vector& nums) {
        int n = nums.size();
        int left = 0;
        int sum = 0;
        int minLen = INT_MAX;

        for (int right = 0; right < n; right++) {
            sum += nums[right];  // 扩大窗口

            while (sum >= target) {
                minLen = min(minLen, right - left + 1);  // 更新最小长度
                sum -= nums[left];  // 收缩窗口
                left++;
            }
        }

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

✅ 核心解释

步骤 说明
sum += nums[right] 扩展右边界,增加当前窗口和
while (sum >= target) 如果窗口的和满足条件,尝试缩小窗口
minLen = min(...) 每次满足条件时尝试更新最小长度
sum -= nums[left]; left++ 收缩左边界,同时维护当前窗口和

例子

输入: target = 7, nums = [2,3,1,2,4,3]

过程:

  • [2] 不满足
  • [2,3] 不满足
  • [2,3,1] 不满足
  • [2,3,1,2] 不满足
  • [2,3,1,2,4] 满足,长度5,尝试缩短 -> [3,1,2,4] -> [1,2,4] -> [2,4] -> 还满足 -> 最小长度变成2
  • 最终返回:2

滑动窗口的通用思维模型

int left = 0;
for (int right = 0; right < nums.size(); right++) {
    // 1. 扩展窗口:增加 right 指针
    // sum += nums[right];

    while (window 满足某个条件) {
        // 2. 缩小窗口:尝试移动 left 指针优化答案
        // sum -= nums[left];
        // left++;
    }
}

滑动窗口适合解决:

  • 连续子数组 / 子串 / 区间(带限制)
  • 最小/最大长度、和、乘积等
  • 一般目标是:最小满足 / 最大不超过 / 第一次达到

题目例子:

题目 内容 技巧
Leetcode 3 最长无重复子串 哈希 + 滑动窗口
Leetcode 76 最小覆盖子串 字符计数 + 窗口压缩
Leetcode 209 最短子数组和 经典模板

你可能感兴趣的:(C++代码随想录刷题知识分享,c++,算法,leetcode,数据结构)