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

力扣209 长度最小的子数组

时间:2022-11-08 12:24:12浏览次数:69  
标签:窗口 target 209 位置 力扣 int 数组 序列

题目:

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

找出该数组中满足其和≥ target的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0

 

暴力破解:O(n2)

(1)外层循环控制子序列起始位置,内层循环控制子序列终止位置

(2)遍历所有的子序列,取子序列最小长度

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int result=0;
        int minlength=nums.length+1; // 子序列最小长度
        for(int i=0;i<nums.length;i++){
            int sum=0;//子序列长度
            for(int j=i;j<nums.length;j++){
                sum+=nums[j];
                if(sum>=target){
                    result=j-i+1;
                    if(result<minlength){
                        minlength=result;
                    }
                }
            }
        }
        return minlength==nums.length+1?0:minlength;
    }
}

超出时间限制

 

滑动窗口思想:O(n)

在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。

在滑动窗口用一个for循环来完成这个操作。j表示窗口终止位置,当子序列大于target时,再移动起始位置i,找有没有更小子序列。

在本题中实现滑动窗口,主要确定如下三点:

  • 窗口内是什么?
  • 如何移动窗口的起始位置?
  • 如何移动窗口的结束位置?

窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。

窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。

窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。

解题的关键在于 窗口的起始位置如何移动,如图所示:

leetcode_209

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int result=0;
        int i=0;
        int minlength=nums.length+1; // 子序列最小长度
        int sum=0;//子序列之和
        for(int j=0;j<nums.length;j++){
            sum+=nums[j];
            while(sum>=target){
                result=j-i+1;
                if(result<minlength){
                    minlength=result;//取更小的窗口长度
                }
                sum-=nums[i];//取到一个>target的窗口之后,再缩小该窗口
                i++;//变更起始位置
            }
        }
        return minlength==nums.length+1?0:minlength;
    }
}

 ps:指路《代码随想录》https://www.programmercarl.com/

标签:窗口,target,209,位置,力扣,int,数组,序列
From: https://www.cnblogs.com/cjhtxdy/p/16869256.html

相关文章

  • 【JavaScript 教程】第六章 数组03— Stack :使用 Array 的push()和pop()方法实现堆栈
    英文 | https://www.javascripttutorial.net/译文|杨小爱在上节,我们学习了JavaScriptArray length属性以及如何正确处理它,错过的小伙伴可以点击文章《​​【JavaScrip......
  • JavaScript数组去重—ES6的两种方式
    说明JavaScript数组去重这个问题,经常出现在面试题中,以前也写过一篇数组去重的文章,(JavaScript数组去重的多种方法原理详解)但感觉代码还是有点不够简单,今天和大家再说两种......
  • 实验4 类与数组、指针
    2022.11.02OOP实验课实验4类与数组、指针任务5代码:vectorInt54.hpp#pragmaonce#include<iostream>#include<cassert>#include<iomanip>usingnamespace......
  • 数组小和
    packageclass04;/***数组小和*在一个数组中,一个数左边比它小的数的总和,叫数的小和,所有数的小和累加起来叫数组的小和,求数组小和*/publicclassCode02_SmallS......
  • 数组~Count digits from a text stream
    题目描述Countdigits,whitespaces(‘’,’\n’,’\t’)andothercharactersfromatextstreamendingwithEOF.输入AtextstreamendingwithEOF输出Pr......
  • 数组~插队
    题目描述有一个按照升序已排好的9个元素的数组,今输入一个数要求按原来排序的规律将它插入数组中。输入第一行,原始数列。第二行,需要插入的数字。输出排序后的数列......
  • 数学(环形数组) 数组 技巧 字符串
    918.环形子数组的最大和intsum=0,curMax=0,max=nums[0],curMin=0,min=nums[0];for(inti:nums){curMax=Math.max(curMax+i,i);max=Math.max......
  • JavaScript之数组高阶API—reduce()
    一文搞懂JavaScript数组中最难的数组API——reduce()前面我们讲了数组的一些基本方法,今天给大家讲一下数组的reduce(),它是数组里面非常重要也是比较难的函数,那么这篇文章......
  • SQL刷题 力扣
    力扣584.寻找用户推荐人:selectnamefromcustomerwherereferee_id!=2orreferee_idisnotNULL;null值无法与确定的值作比较,用isNULL或者isnotNULL判断 ......
  • 将数组按照指定的顺序排序处理
    转载:https://blog.csdn.net/yang_shibiao/article/details/1249681391.数据准备建表语句:   createtabletemp(       provincestring,       city......