首页 > 其他分享 >209. 长度最小的子数组

209. 长度最小的子数组

时间:2024-03-18 23:12:45浏览次数:21  
标签:end target minlen 209 sum start int 数组 长度

209. 长度最小的子数组

https://leetcode.cn/problems/minimum-size-subarray-sum/?envType=study-plan-v2&envId=top-interview-150

 

思路

三种方法中,具有最优时间复杂度的方案

滑动窗口

设置 start=0 end=0

执行循环:

  end向后探测,直到sum值大于等于target,更新最优长度

  然后start向前探测,探测过程中,如果sum仍然大于等于target,更新最优长度,

    start向前探测,直到sum小于target时候停止。

 

此过程很像毛毛虫先前蠕动行为, 可以称之为毛毛虫行走法。

 

https://leetcode.cn/problems/minimum-size-subarray-sum/solutions/305704/chang-du-zui-xiao-de-zi-shu-zu-by-leetcode-solutio/?envType=study-plan-v2&envId=top-interview-150

 

Code

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        /*
        [start, end]
        以此为窗口探测总和>=target的最小连续序列长度
        */
        int start = 0;
        int end = 0;
        long long sum = nums[0];
        int minlen = 1e5+5;

        while(start<=end && end<nums.size()){
            // cout << "------------------------------------------" << endl;

            // cout << "BEGIN ====> start = " << start << " end=" << end << endl;

            // if (sum >= target){
            //     minlen = min(minlen, end-start+1);

            //     cout << "update1 minlen = " << minlen << endl;
            // } 

            do {
                if (sum >= target){
                    minlen = min(minlen, end-start+1);

                    // cout << "update2 minlen = " << minlen << endl;
                    break;
                }

                end++;
                if (end >= nums.size()){
                    break;
                }

                sum += nums[end];
            } while(true);

            if (end >= nums.size()){
                break;
            }

            // cout << "AFTER ENLARGE end ====> start = " << start << " end=" << end << endl;

            do {
                if (sum < target){
                    break;
                } else if (sum >= target){
                    minlen = min(minlen, end-start+1);

                    // cout << "update1 minlen = " << minlen << endl;
                } 

                if (start<end){
                    sum -= nums[start];
                    start++;
                } else {
                    break;
                }
            } while(true);

            // cout << "AFTER ENLARGE start ====> start = " << start << " end=" << end << endl;

            // cout << "minlen = " << minlen << endl;
            // cout << "END ====> start = " << start << " end=" << end << endl;

            if (minlen == 1){
                break;
            }
        }

        return minlen==1e5+5?0:minlen;
    }
};

 

标签:end,target,minlen,209,sum,start,int,数组,长度
From: https://www.cnblogs.com/lightsong/p/18081737

相关文章

  • JavaScript学习笔记5: 对象 - 数组Array
    JS对象-数组Array数组的定义及特性数组定义<script>//数组定义方式1,赋值给变量vararr1=newArray(1,2,3);//数组定义方式2,初始化数组vararr2=[4,5,6];</script>JS数组长度可变<script>vararr2=[4,5,6];//数组初始长度为3......
  • LeetCode2024年3月18日每日一题(303. 区域和检索 - 数组不可变)
    303.区域和检索-数组不可变一维前缀和定义构建前缀和数组区间求和示例适用场景题目代码解释成员变量构造函数`sumRange`方法注释版代码一维前缀和是处理数组区间求和问题的一种非常有效的方法。它通过预处理输入数组,使得任何区间的和都可以在常数时间内被计算......
  • 深入了解指针(3)【数组指针变量】【函数指针变量】【typedef关键字】
    一.数组指针变量1.什么是数组指针变量?说到数组指针,那必然要说一下指针数组,指针数组是什么呢?指针数组是一种数组,只不过这种数组存放的是地址(指针)。那把这两个词反过来,数组指针是什么?它是指针变量,还是数组?答案是:指针变量。这个指针有些特殊,它存放的是数组的地址,它是能够指向数......
  • css实现一个三排数组滚动抽奖
    简单理解可视化版本:<divclass="slot-machine"><divclass="reel"><div>Item1</div><div>Item2</div><div>Item3</div><div>Item1<......
  • Java基础知识篇04——数组
    哈喽,大家好!我是白夜,今天给大家聊聊数组。一、概念计算机在内存区域分配的一段连续的区域(空间),用来存储同种类型的多个数据简单的理解,数组就是一堆盒子,同一时间,可以保存多个相同数据类型的数据数组名:数组的名字数组元素:就是存放在数组里面的数据数组索引:就是数组里面连......
  • Go04-数组+切片+map
    Go4-数组+切片+map1.数组的定义、赋值、访问和遍历//1数组用来存放多个同一类型的数据,在Go中数组是值类型。//2数组的定义、赋值和遍历。//定义数字。vararrs[2]int//给数组元素赋值。arrs[0]=0arrs[1]=2//02fori:=0;i<len(arrs);i++{fmt.P......
  • 代码随想录算法训练营第23天|669. 修剪二叉搜索树|108.将有序数组转换为二叉搜索树|53
    代码随想录算法训练营第23天|669.修剪二叉搜索树|108.将有序数组转换为二叉搜索树|538.把二叉搜索树转换为累加树|总结篇669.修剪二叉搜索树这道题目比较难,比添加增加和删除节点难的多,建议先看视频理解。题目链接/文章讲解:https://programmercarl.com/0669.%E4%BF%A......
  • 微信小程序蓝牙红外发送ArrayBuffer合并字节数组
    微信小程序中与设备进行通讯时,经常需要在前面加一些字节,或者处理分包的时候需要加一些字节过去,如果在后端很好操作,但是在小程序中由于ArrayBuffer不支持直接操作,非常不方便最近一个与设备通讯中,需要添加前导字符,百度了一圈没有好的方案,东拼西凑了才算是搞出来了 functioncop......
  • 深入了解指针(2)【指针与数组】【二级指针】
    一.使用指针访问数组关于数组,我在上次的博客中也提到了一些比较重要的知识点。首先就是数组名,数组名只有在两种情况下代表的是整个数组的地址,一个是在sizeof里面,一个是用&符号。那么为什么我们可以用指针来访问数组呢?因为数组在内存中是连续存放的,只要我们找到第一个地址,那么......
  • Java学习系列(三):数组
    一、数组的基本概念及作用数组:是一组相同数据类型元素的集合,是一个容器①数组可以存储基本数据类型,也可以存储引用数据类型②数组创建时必须指定长度,且长度不可变③数组中每个元素空间是连续的声明数组格式:数据类型[]数组名字例如:int[]a;数据类型数组的名字[]......