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

LeetCode209.长度最小的子数组

时间:2023-09-10 17:32:15浏览次数:32  
标签:遍历 min int 位置 起始 result 数组 LeetCode209 长度

9月8日 LeetCode209.长度最小的子数组

https://leetcode.cn/problems/minimum-size-subarray-sum/description/

学习内容

题目的内容是给一个正整数的数组及目标值target,找到大于等于目标值的连续数组最小长度的区间。 容易想到的方法是两层for来遍历,分别表示区间终止位置和区间起始位置,然后把数组中所有区间的情况都遍历出来,找到大于等于s的最小区间长度。

用两个for来做起始位置和终止位置,两个指针中间的集合,更像是一个滑动窗口,滑动窗口可以用一个for来做两个for做的事。关键是理解清楚,用一个for来遍历,需要判断遍历的指针j是滑动窗口的起始还是终止位置

  1. 假设一个for遍历的j表示起始位置,那终止位置怎么遍历?

起始位置j指到哪里,终止位置都要把后面的元素都遍历一遍。才能返回所有以这个位置为起始位置的集合。再去判断集合中的所有元素,去收集大于等于s这些集合中的所有长度,从中取一个最小值。那结论就是:把一个for遍历的j当做是起始位置,终止位置依然要把所有位置遍历一遍,和暴力没区别。

  1. 假设一个for遍历的j表示终止位置,那就需要一个动态移动的策略去移动起始位置。

滑动窗口解决的问题就是,如何一次性的找好移动的起始位置,for中的j已经确定了滑动窗口的终止位置。起始位置i就需要从开始一个个的往后移动,看是否满足集合和的条件,记录下符合条件的滑动窗口长度。每次移动到条件不满足时,就记录了终止位置j的最小区间长度。

代码

import (
    "fmt"
    "math"
)
func minSubArrayLen(target int, nums []int) int {
    i:=0
    result:=math.MaxInt64
    numssize:=len(nums)
    sum:=0
    for j:=0; j<numssize; j++{
        sum += nums[j]
        for sum>=target{
            subL:=j-i+1
            result=min(result,subL)
            sum=sum-nums[i]
            i++
        }
    }
    if result == math.MaxInt64{
        return 0
    }
    return result
}
func min(x ,y int) int{
    if x<y{
        return x
    } 
    return y
}

go补充

math.MaxInt64得到最大值

max和min函数的自定义实现

参考:

  1. 获得Go中各种整数类型的最大值和最小值的方法 - 掘金:https://juejin.cn/post/7114479975251574792
  2. go语言为什么没有min/max(int, int)函数:https://www.jianshu.com/p/4a833196b02c

标准代码的改进

优化点学习:

  1. result不必设置为最大值,设置为长度值的最大即可,因此不需要用到math函数;
  2. 不用写min函数,多次复用时再去写min。只用一次用一个if解决即可;
func minSubArrayLen(target int, nums []int) int {
  i:=0
  l:=len(nums)
  sum:=0
  // 这里不用设成最大值
  result:=l+1
  for j:=0;j<l;j++ {
    sum+=nums[j]
    for sum >= target{
      subLength:=j-i+1
      if subLength<result{
        result=subLength
      }
      sum-=nums[i]
      i++
    }
  }
  if result==l+1 {
    return 0
  }
  return result
}

标签:遍历,min,int,位置,起始,result,数组,LeetCode209,长度
From: https://blog.51cto.com/u_15955938/7427195

相关文章

  • 较真:js判断中文字符串长度的正确方法
    对于使用javascript编程的人来说,判断字符串长度应该是常用又简单的操作,但在判断包含有中文字符或其他非asci字符的字符串长度时,却有些坑在里面。错误做法1先看看最常用的做法,也就是使用String.length判断:letstr="你好奥";letlen=str.length;console.log(len);//打印出来......
  • 深入解析Java中的数组复制:System.arraycopy、Arrays.copyOf和Arrays.copyOfRange
    当涉及到在Java中处理数组时,有许多方法可供选择,其中一些包括System.arraycopy()、Arrays.copyOf()和Arrays.copyOfRange()。这些方法允许您在不同的数组之间复制数据,但它们之间有一些细微的差异。在本篇博客文章中,我们将深入探讨这些方法,以便您了解何时使用它们以及如何正确使用它......
  • 什么是 Angular 应用 angular.json 中的 assets 数组
    在Angular项目中,angular.json是一个非常重要的配置文件,用于定义和管理项目的各种设置和构建选项。其中,assets数组是angular.json中的一个关键配置项,用于指定需要在构建后包含在应用程序中的静态资源文件和文件夹。在本文中,我将解释什么是assets数组,并提供详细示例来说明如何使用它......
  • 数组
    title:数组index_img:img/7.svgtags:-JavaSEcategories:-JavaSEhide:falseexcerpt:数组访问、遍历、越界概念数组是一种容器,可以存储同种数据类型(支持隐式转换)的多个值。定义数据类型[]数组名String[]students;初始化一旦初始化后,数组长度就固定......
  • 【笔记】二维数组在内存地址中的存储
    最近在学习STM32的ADC和DMA多通道采集过程中有使用到二维数组,姑且记录一下以作备忘。参考:http://c.biancheng.net/view/2022.html举个例子就能很简单的说明了创建一个M行N列的int数组,数组定义如下(例:M=3N=5)#defineM3#defineN5intarr[M][N];给数组按顺序赋值int(*......
  • delphi FireDAC 调用 Execute 提示 `[FireDAC][SQL Server Native Client 10.0]字符串
    FireDAC调用Execute提示[FireDAC][SQLServerNativeClient10.0]字符串数据,长度不匹配错误问题调用Execute向SQLServer数据库中批量插入数据时,参数中有BLOB数据类型(ftBlob、ftMemo等)时,出现[FireDAC][Phys][ODBC][Microsoft][SQLServerNativeClient10.0]字符串......
  • ACM模式下快速读取二维数组
    ACM二维数组的读取输入550100001110000000111000010读取Scannerin=newScanner(System.in);introw=in.nextInt();intcol=in.nextInt();int[][]arr=newint[row][col];for(inti=0;i<row;i++){for(intj=0;j<col......
  • Java从入门到精通-数组(二)
    4.数组的基本操作数组的基本操作包括遍历数组、填充替换数组元素、对数组进行排序、复制数组以及查询数组中的元素。•4.1遍历数组遍历数组是访问数组中所有元素的过程,通常使用循环完成。使用 for 循环遍历数组:int[]numbers={1,2,3,4,5};for(inti=0;i<numbers.l......
  • 数组学习
    这个是数组中的Arrays类,里面有很多种方法,然后几种常见的在PPT上 数组就是,如上图所示,行与行之间用逗号隔开,也装在大括号里,这个点不太熟悉......
  • 数组
    这边是java数组的初始化,C++有同有异;然后nums.length可以获取数组长度......