209. 长度最小的子数组

题目:

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

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

代码:

方法一:滑动窗口 + sum 数组

cpp 复制代码
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int len = nums.size();
        bool flag = false;
        int ans = len;

        for (int i = 0, s = 0; i < len;
             i++) { // 判断从[0, i] 是否满足大于等于 target
            s += nums[i];
            if (s >= target) {
                flag = true;
                ans = i + 1;
                break;
            }
        }
        if (!flag)
            return 0; // 整个数组元素之和无法满足

        vector<long long> sum(len, 0);
        sum[0] = nums[0];
        for (int i = 1; i < len; i++) { // 计算 sum 数组
            sum[i] = sum[i - 1] + nums[i];
        }

        int tmp = ans; // 记录当前合法区间的终点 [0, ans-1]
        for (int i = 0; i < tmp; i++) { // 减少前面的冗余部分 [tmp-ans ,tmp-1]
            if (sum[tmp - 1] - sum[i] >= target)
                ans--;
        }

        for (int i = ans; i < len; i++) { // 逐步扩展后面的元素
            bool f = false;
            while (sum[i] - sum[i - ans] >= target) { // 扩展后逐步减少前面的冗余元素
                ans--;
                f = true;
            }
            if (f) // 补足
                ans++;
        }
        return ans;
    }
};
相关推荐
小郎君6581 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧1 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
hold?fish:palm1 小时前
40 二叉树的直径
c++·leetcode
Shimeri2 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
Evand J2 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波
guo_wen_qiang2 小时前
二叉树的层序遍历-使用双端队列Deque
算法·leetcode·1024程序员节
爱读书的小胖2 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
CCblandy2 小时前
前缀缓存命中率不靠引擎靠排列:本机仿真 3 轮,易变字段放开头 98.0%→0.0%
人工智能·python·算法·自然语言处理·性能优化
上班摸鱼下班游戏2 小时前
Unity 仿生智能算法 从蚁群算法 开始
算法·unity·游戏引擎
pipixia200332 小时前
C++ 面试高频:namespace 的 6 个知识点,从 using 到匿名命名空间
c语言·学习·算法·嵌入式·命名空间·c++面试·匿名命名空间