• 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    思路:

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

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

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

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

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

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

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

    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;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    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;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    待定…

  • 相关阅读:
    Java实现人脸识别和指纹认证
    C语言程序设计教程(第三版)李凤霞 第九章课后习题答案
    react从不会到入门
    ArcGIS Pro 3.0最新消息
    小码哥学习笔记:APP内存管理
    LeetCode每日一题:2731. 移动机器人(2023.10.11 C++)
    kubernetes集群搭建Zabbix监控平台
    threejs开发太阳系案例
    飞速(FS)MTP®光纤跳线系列——数据中心布线理想选择
    【计网】二、物理层
  • 原文地址:https://blog.csdn.net/qq_24726043/article/details/133001964