LeetCode 之 长度最小的子数组

算法模拟: Algorithm Visualizer

在线工具: C++ 在线工具

如果习惯性使用Visual Studio Code进行编译运行,需要C++11特性的支持,可参考博客:

VisualStudio Code 支持C++11插件配置

长度最小的子数组


LeetCode 长度最小的子数组

问题:

复制代码
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
并返回其长度。如果不存在符合条件的子数组,返回 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

思路:

可以使用滑动窗口的方法, 其实也是双指针的思想

定义两个指针 leftright ,分别表示子数组的左边界和右边界。

初始时,将 left right 都指向数组的第一个元素。

然后,我们不断增加 right 指针的位置,同时计算子数组的总和。

如果总和大于等于 target,则更新最小长度,并将 left 指针向右移动,缩小子数组的范围。

重复这个过程,直到 right 指针到达数组的末尾。

最后,返回最小长度即可。

C++示例

c 复制代码
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        // 左边界指针
        int left = 0;
        // 初始化满足条件的最小长度
        int minLen = INT_MAX;
        // 子数组总和
        int curValue = 0;
        for (int right = 0; right < nums.size(); ++right) {
            curValue += nums[right];
            while(curValue >= target) {
                minLen = std::min(minLen, right - left + 1);
                curValue -= nums[left];
                left++;
            }
        }
        return (minLen != INT_MAX) ? minLen : 0;
    }
};

TypeScript示例

typescript 复制代码
function minSubArrayLen(target: number, nums: number[]): number {
    let left:number = 0;
    let minLen: number = Infinity;
    let curValue: number = 0;
    for (let right = 0; right < nums.length; right++) {
        curValue += nums[right];
        while (curValue >= target) {
            minLen = Math.min(minLen, right - left + 1);
            curValue -= nums[left];
            left++;
        }
    }
    return (minLen !== Infinity) ? minLen : 0;
};

待定...

相关推荐
_OP_CHEN2 小时前
【算法基础篇】(五十七)线性代数之矩阵乘法从入门到实战:手撕模板 + 真题详解
线性代数·算法·矩阵·蓝桥杯·c/c++·矩阵乘法·acm/icpc
天天爱吃肉82182 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
im_AMBER2 小时前
Leetcode 114 链表中的下一个更大节点 | 删除排序链表中的重复元素 II
算法·leetcode
xhbaitxl2 小时前
算法学习day38-动态规划
学习·算法·动态规划
多恩Stone2 小时前
【3D AICG 系列-6】OmniPart 训练流程梳理
人工智能·pytorch·算法·3d·aigc
历程里程碑3 小时前
普通数组----轮转数组
java·数据结构·c++·算法·spring·leetcode·eclipse
pp起床3 小时前
贪心算法 | part02
算法·leetcode·贪心算法
sin_hielo3 小时前
leetcode 1653
数据结构·算法·leetcode
2501_901147833 小时前
面试必看:优势洗牌
笔记·学习·算法·面试·职场和发展
YuTaoShao3 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法二)排序 + 二分查找
数据结构·算法·leetcode