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

【LeetCode】209. 长度最小的子数组

时间:2024-03-07 22:02:25浏览次数:24  
标签:right target 209 minLength sum int 数组 LeetCode left

题目:209. 长度最小的子数组

解题思路:

  1. 初始化最小长度,设置为最大值,当最小长度变小时,该值更新
  2. 设置left和right指针,left指针用于记录左边界,当求和sum大于target时,左指针右移;right指针记录右边界,当求和sum小于target时,右指针右移,继续寻找符合要求的子字符串。
  3. 当右边界符合题目要求时,更新最小长度minLength

C代码实现

int minSubArrayLen(int target, int* nums, int numsSize){
    int left = 0, right = 0;
    //初始化最小长度为INT_MAX,最小值初始化为最大,最大值初始化为最小
    int minLength = INT_MAX;
    int sum = 0;


    //右边界向右扩展
    for(; right < numsSize; ++right) {
        sum += nums[right];

        //当sum的值大于等于target时,保存长度,并且收缩左边界
        while(sum >= target) {
            int subLength = right - left + 1;
            minLength = minLength < subLength ? minLength : subLength;
            sum -= nums[left++];
        }
    }

    //判断最小长度是否为空,若为空,则返回0,否则返回minLength
    return minLength == INT_MAX ? 0 : minLength;
}

Java代码实现

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int res = Integer.MAX_VALUE;
        int left = 0;
        int right = 0;
        int temp = 0;

        // 只管右指针,左指针的控制隐含在while(temp>=target)中,如果该条件不满足,则不用移动左指针
        while(right < nums.length){
            temp += nums[right];
            while(temp >= target) {
                res = Math.min(res, right - left + 1);
                temp -= nums[left];
                left++;
            }
            right++;
        }

        return res==Integer.MAX_VALUE ? 0 : res;
    }
}

参考资料:209.长度最小的子数组

标签:right,target,209,minLength,sum,int,数组,LeetCode,left
From: https://www.cnblogs.com/syr463/p/18059862

相关文章

  • 后缀数组学习笔记
    后缀数组学习笔记定义所谓后缀,指的是对于一个字符串\(s\),如果它的下标从\(1\)到\(n\),那么对于\(s\)的一个后缀\(i=s[i\dotsn]\)。所谓后缀数组sa[],就是按照这些后缀的字典序排序后得到的数组。更具体的,后缀数组sa[i]中存储的是字符串\(s\)中排名为\(i\)的后缀的......
  • 2023-03-07 leetcode写题记录
    2023-03-07leetcode写题记录目录2023-03-07leetcode写题记录148.排序链表题目链接题意解法归并排序56.合并区间题目链接题意解法复健中,第一次重新写链表题。写链表题需要注意下面这些事项:写链表时,可以把链表理解成一个数,只不过这个数有特殊含义,代表着一个地址;"->"是对地......
  • js:判断对象或数组
    一、判断值是否是对象:toString方法【常用】Object.prototype.toString.call(val)==='[objectObject]'//true表示为对象//这里使用call方法改变作用域 constructor方式val?.constructor===Object//true代表为对象 typeof与instanceof方式:typeof......
  • P8686 [蓝桥杯 2019 省 A] 修改数组
    备赛蓝桥杯和icpc的习题:一道并查集的题目>#include<iostream>>#include<vector>>#include<algorithm>>#include<math.h>>#include<string>>#include<string.h>>#include<iomanip>>#include<map>&g......
  • JS数组去重的10种方法
    vararr=[1,1,'true','true',true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,'NaN',0,0,'a','a',{},{}]利用Set(ES6中最常用)functionuseSet(arr){returnArray.from(newSet(arr))} 利用for......
  • CUDA指针数组Kernel函数
    技术背景在前面的一篇文章中,我们介绍了在C++中使用指针数组的方式实现的一个不规则的二维数组。那么如果我们希望可以在CUDA中也能够使用到这种类似形式的不规则的数组,有没有办法可以直接实现呢?可能过程会稍微有一点麻烦,因为我们需要在Host和Device之间来回的转换,需要使用到很多C......
  • leetcode120. 三角形最小路径和
    leetcode120.三角形最小路径和这道题的关键在于想到dp[i][j]=min(dp[i-1][j-1],dp[i-1][j])+triangle[i][j];太久没做过算法题了,连设一个dp数组都没意识到我的代码classSolution{public:intminimumTotal(vector<vector<int>>&triangle){intsize......
  • LeetCodeHot100 1.两数之和 46.字母异位词分组 128.最长连续序列
    1.两数之和https://leetcode.cn/problems/two-sum/description/?envType=study-plan-v2&envId=top-100-likedpublicint[]twoSum(int[]nums,inttarget){HashMap<Integer,Integer>map=newHashMap<>();for(inti=0;i<nums.l......
  • day57 动态规划part14 代码随想录算法训练营 53. 最大子数组和
    题目:53.最大子数组和我的感悟:理解难点:递推公式想错了。听课笔记:我的错误的代码:通过截图:代码易错点:老师代码:扩展写法:资料:......
  • leetcode-快乐树
    自己写的:classSolution:defisHappy(self,n:int)->bool:n_temp=n#用n_temp保存当前的数字,以便迭代过程中使用count=0#用于计数,避免无限循环,设定最多迭代10次whilecount<10:#最多迭代10次n_str=str(n_temp......