力扣 209. 长度最小的子数组

一、题目描述

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

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

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

示例 2:
输入:target = 4, nums = [1,4,4]
输出:1

示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

二、题解

通过双指针来标识一个窗口,当窗口内数据和小于 target 时需要将后指针后移以增大数据和,当数据和小于等于 target 时需要将前指针后移以增大数据和。时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)

class Solution {
public:
    int minSubArrayLen(int target, vector<int> &nums) {
        int win_begin = 0, win_end = 0;  // 滑动窗口起始位置和结束位置
        int win_sum = 0;  // 滑动窗口中的数据的和
        int ret = nums.size() + 1;  // 返回值

        for (win_end = 0; win_end < nums.size(); win_end++) {
            win_sum += nums.at(win_end);
            while (win_sum >= target) {
                ret = min(ret, win_end - win_begin + 1);
                win_sum -= nums.at(win_begin);  // 滑动窗口
                win_begin++;
            }
        }
        
        return (ret == nums.size() + 1) ? 0 : ret;
    }
};

在这里插入图片描述

你可能感兴趣的:(数据结构与算法,leetcode,算法)