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

LeetCode209. 长度最小的子数组

时间:2023-10-15 15:45:23浏览次数:59  
标签:target nums int resultLength 数组 LeetCode209 长度

题目描述

给定一个含有 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

提交代码与结果

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        for(int i=0;i<target;i++){
            for(int j=0;j<nums.length;j++){
                //j-i==-1则当前长度i对于数组已经越界最小方向
                if((j-i)>=0){
                    int sum=0;
                    for(int k=0;k<=i;k++){
                        sum+=nums[j-k];
                    }
                    if(sum>=target)return i+1;
                }
                //(j+i)==nums.length代表数组在右边已经越界
                if((j+i)<=nums.length-1){
                    int sum=0;
                    for(int k=0;k<=i;k++){
                        sum+=nums[j+k];
                    }
                    if(sum>=target)return i+1;
                }
            }
        }
        return 0;
    }
}

结果
image

学习到的东西

第一次的代码,我个人当时还以为是target^2*n的时间复杂度来着,而且是按照示例给出的数组进行构思来着,没有想到如果target足够大,甚至比nums的长度还要大的时候,算法就退化成O(n^2)了。也确实是个人考虑太简单了。
从大佬那学到的方法为滑动窗口方法,其实也是双指针法,也就是执行起来很像滑动窗口而已。
左右指针分别代表滑动窗口的左右边界,右指针就是for循环内的i,每次循环都会将左右边界内的若干数值进行相加,如果结果满足条件(sum>=target),则会将当前滑动窗口的长度和之前的长度相比较,直至结束才能确定最小的滑动窗口也就是结果数组长度的最小值。继而将窗口的左边界向右移动一位并将左指针指向的值从窗口和中剪掉,再次判断是否满足条件,以此来得到更小的结果数组的长度。

最终得到此题的个人代码

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int left=0;
        int sum=0;
        int resultLength=Integer.MAX_VALUE;
        //滑动窗口
        for(int right=0;right<nums.length;right++){
            sum+=nums[right];
            while(sum>=target){
                //求出最小的子序列长度
                //计算当前符合条件的子序列长度
                resultLength=Math.min(resultLength,right-left+1);
                sum-=nums[left++];
            }
        }
        return resultLength==Integer.MAX_VALUE?0:resultLength;
    }
}

标签:target,nums,int,resultLength,数组,LeetCode209,长度
From: https://www.cnblogs.com/whitePuPigeon/p/17765685.html

相关文章

  • 解析“字符指针变量,数组指针变量,二维数组”
    1.字符指针变量字符指针变量是存放地址的charch='w'; char*pc=&ch; *pc='w';表达式的两个属性:【值属性】计算后的值是多少【类型属性】类型是什么注:hello是常量字符串,不能被修改,是连续存放的,可用printf("%s\n",p);打印字符串。常量字符串指的是在程序中声明的一个不......
  • 无涯教程-NumPy - 数组属性
    在本章中,无涯教程将讨论NumPy的各种数组属性。ndarray.shape此数组属性返回一个由数组维组成的元组。它也可以用来调整数组的大小。示例1importnumpyasnpa=np.array([[1,2,3],[4,5,6]])printa.shape输出如下-(2,3)示例2#这会调整ndarray的大小importnump......
  • 【算法题】6939. 数组中的最大数对和
    题目:给你一个下标从0开始的整数数组nums。请你从nums中找出和最大的一对数,且这两个数数位上最大的数字相等。返回最大和,如果不存在满足题意的数字对,返回-1。示例1:输入:nums=[51,71,17,24,42]输出:88解释:i=1和j=2,nums[i]和nums[j]数位上最大的数字相等,且这......
  • 【算法题】88. 合并两个有序数组
    题目:给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的......
  • js对json数组中的json对象去重
    实现思路:使用map()方法将JSON对象转换为字符串,并使用Set对象去除重复项。然后,我们将字符串再次转换为JSON对象,并使用Array.from()方法将其转换为数组。这样,我们就得到了一个去重后的JSON对象数组。 letarr=[{name:'zhangsan',age:10},{name:'lisi',age:30},{name:'zha......
  • 09数组
    数组定义方式int[]nums;静态初始化int[]nums1={1,2,3,8,5,2};动态初始化int[]nums2=newint[5]; //表示5个长度的int数组foreach​ 这种方式简单更适合用来打印输出,但是如果要操作某一个数的话是不好用的for(inti:nums1){//foreachnums1.for这......
  • [LeetCode] 1354. Construct Target Array With Multiple Sums 多次求和构造目标数组
    Youaregivenanarray target ofnintegers.Fromastartingarray arr consistingof n 1's,youmayperformthefollowingprocedure:let x bethesumofallelementscurrentlyinyourarray.chooseindex i,suchthat 0<=i<n andsettheva......
  • #yyds干货盘点# LeetCode程序员面试金典:最小操作次数使数组元素相等
    1.简述:给你一个长度为 n 的整数数组,每次操作将会使 n-1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。 示例1:输入:nums=[1,2,3]输出:3解释:只需要3次操作(注意每次操作会增加两个元素的值):[1,2,3]=>[2,3,3]=>[3,4,3]=>[4,4,4]示例2:输入:nums=[1......
  • 学习C语言心得-自定义函数-对整形有序数组进行二分查找-二分法
    对整形有序数组进行二分查找#include<stdio.h>intfind(intarr[],intsz,intk){ intleft=0;intright=sz-1; while(left<=right) { intmid=left+right/2; if(k>arr[mid]) { left=mid+1; } if(k<arr[mid]) { right=mid......
  • python 实现统计fasta文件每一条序列的长度
     001、a、[root@pc1test1]#lsa.fatest.py[root@pc1test1]#cata.fa##测试fasta>chr1tttcccggg>chr2tttgggccc>chr3cccttt>chr4aaaaattt[root@pc1test1]#cattest.py##统计每条序列的长度#!/usr/bin/envpython3#-*-coding:......