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

长度最小的子数组

时间:2024-04-01 21:32:22浏览次数:477  
标签:right target int 最小 len 数组 长度 left

题目

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

找出该数组中满足其总和大于等于 target 的长度最小的 连续

子数组

 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

解析

1.正整数数组,目标值target,找出一个连续区间,使得这个区间大于等于目标值(最短的长度返回)

示例 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

解法

    解法一

暴力枚举出所有的子数组的和-->优化,双指针法 left right 两个指针同时遍历 

具体步骤

left从最左边开始,right从下个数字开始,right遍历一个数字,就和left相加,返回值给到sum,判断sum和target的值,如果sum小于target,则继续遍历,如果大于则停止 此时长度位  len=right-left的距离;

解法二

利用单调性   使用“同向双指针”(滑动窗口)的来优化

怎么用:1.left=0,right=0

               2.进窗口

               3.判断     出窗口    ------>(判断成立 更新结果)(类似于暴力枚举)

时间复杂度n+n-->2n  o(n)

代码

class Solution 
{
public:
    int minSubArrayLen(int target, vector<int>& nums) 
    {
        int n=nums.size();
        int sum=0;
        int len=INT_MAX;
        for(int left =0,right=0;right<n;right++)
        {
            sum+=nums[right];
            while(sum>=target)
            {
                len=min(len,right-left+1);//更新结果
                sum-=nums[left++];//出窗口
            }
        }
        return len==INT_MAX?0:len;
    }
};

以上内容只是小编的一点间接,如有错误或者不全之处请及时指出,谢谢大家的关注

标签:right,target,int,最小,len,数组,长度,left
From: https://blog.csdn.net/2301_78350690/article/details/137208377

相关文章

  • 山脉数组 python
    ‘’'如果—个数组k符合下面两个属性,则称之为山脉数组数组的长度大于等于3存在i,i>0且i<len(k)-1,使得k[0]<k[1]<…<k[i-1]<k[i]>k[i+1].>k[len(k)-1],这个i就是顶峰索引。现在,给定—个山脉数组,求顶峰索引。‘’’deffind_peak(arr): n=len(arr) ifn<......
  • 215. 数组中的第K个最大元素(中等)
    核心思想手写堆构建一个大顶堆,删除k-1个堆顶元素。为什么是size/2-1?考虑最后一个元素的下标size-1那么父节点为(size-1)/2classSolution{publicintfindKthLargest(int[]nums,intk){intsize=nums.length;buildHeap(nums,siz......
  • 76. 最小覆盖子串(困难)
    核心思想滑动窗口,先从头开始找到包含t的子串,然后缩短窗口左边界,直到不包含再扩展右边界。匹配过程:s="ADOBECODEBANC",t="ABC"匹配:"ADOBEC"缩短:"DOBEC"匹配:"DOBECODEBA"缩短:"ODEBA"匹配:"ODEBANC"缩短:"ANC"缩短过程中记录答案代码public......
  • 平均数为k的最长连续子数组(美团2024届秋招笔试第三场编程真题)
    核心思想每个数-k计算前缀和并放入mapkey=前缀和value=当前下标由于需要最长的子数组所以只记录最先存在的下标出现重复的前缀和说明存在平均值为k的区间[pre+1,i]importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Sc......
  • 【学习笔记】字符串基础:后缀数组
    后置数组好难啊好难啊好难啊好难啊好难啊好难啊最后还是听了不知道从ftp里搞出来的yspm讲课视频才听懂的,但是yspm用的屏幕绘画是看不见的比较尊贵,然后开了画图本文约定字符串下标从\(1\)开始后缀数组后缀数组,即\(\text{SA(SuffixArray)}\),主要关系到两个数组:\(sa......
  • leedcode-区域和检索 - 数组不可变
    自己写的,耗时很长classNumArray:def__init__(self,nums:List[int]):#初始化NumArray类,接收一个整数列表nums作为参数self.nums=nums#将传入的nums列表存储为对象的属性defsumRange(self,left:int,right:int)->int:"""......
  • 动态内存管理【malloc,calloc,realloc和free的理解】【柔性数组的概念】
    一.为什么要有动态内存分配我们知道,当我们创建变量的时候,我们会向系统申请一定大小的空间内存。比如inta=10或者intarr[10];我就向内存申请了4或者40个字节的大小来存放数据。但是当我们一旦申请好这个空间,大小就无法调整了。但是对于空间的需求,不仅仅就只有上面的情况。有时......
  • 2673. 使二叉树所有路径值相等的最小代价
    思路先看3节点的子树,想要路径值相同,只能修改叶子节点的值,如上图只能2去+1操作。核心思想:那么对于任意左右孩子节点,想要从根节点下来的路径相同,只能修改孩子节点。所以我们只需要从下至上记录叶子节点到当前节点的路径值,然后计算当前节点和右节点的差值。详细看灵神树上贪心......
  • c语言例题,计算字符串长度,递归思想
    c语言中,计算字符串长度算是一个比较经典的题了,而今天我们运用两种不同的求解方法来写出不同的程序来实现计算字符串的功能。主函数 先看到主函数,主函数中设置了一串7个字符的字符串,而后面接下来定义了两个变量len1和len2,同时分别打印len1和len2,当然,打印的这两个变量其实就......
  • js数组置顶元素(将某一项移到首位)
    方法1letarr=[1,2,3]//假设选中的元素为第二个arr.forEach((item,index)=>{ if(item===2){ arr.unshift(arr.splice(index,1)[0])}})console.log(arr)//[2,1,3]方法2letarr=[1,2,3,4]letkey=3//假设选中的元素为第二个for(leti=1;i<arr.length;i++){if(arr[i]==......