力扣刷题-数组篇-长度最小的子数组

6 篇文章 0 订阅
4 篇文章 0 订阅

一. 题目描述

在这里插入图片描述题目链接:209. 长度最小的子数组

二. 思考步骤

1. 暴力循环法:
方法大致就是,使用两个循环,一个循环用于从数组中定位从哪一个元素开始,作为连续数组的开头(直接把整个数组遍历一遍),知道了连续数组的开头元素以后,就好办了,直接用第二个循环,把从开头元素和后面连续的几位元素值加起来,只要元素值之和>=target,就立马记录当前连续数组的长度并直接退出当层循环,防止多加入一个元素的长度。
至于怎么记录那一堆连续数组的长度,并从中挑出最短的长度?我想了两个方法,第一个是:新建一个数组专门用来存放这些长度值,然后挑最大的呗。第二个是:一边计算当前连续数组的长度,一边比较出更小的长度,遍历完后得到的更小的长度,就是最小长度值。(我采用的第二个,但是出现了一点小问题)
错误代码示例:
在这里插入图片描述这里我设置的min初始值为原数组的长度,因为我们要找的是更短的长度,所以只能一次比一次短,连续子数组最长的长度最长也不可能超过原数组nums的长度。
但是注意,这里我犯了一个小错误,就是没有考虑到就算整个数组加起来,也不超过target值的情况,导致我下面万一找不到更小的连续数组,最终输出的长度就会是原数组的长度。
所以,我们得先确定整个数组是否至少存在这样一个连续数组,满足元素和>=target,我直接将整个数组元素加起来算一下,满足条件说明至少原数组就符合条件,下面的判断就可以顺利成章进行了,否则压根就不存在这样的数组,直接输出长度为0。
代码成功示例:
在这里插入图片描述时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)

2. 滑动窗口
引用一下carl哥的动态图(有兴趣关注微信代码随想录就可):
在这里插入图片描述

滑动窗口方法也可以称为双指针方法,因为该方法主要就是通过两个指针构成连续数组的左右区间,根据符合条件的数组,计算其长度,然后不断调整其连续子数组的起始位置和终止位置,最终得到其最小长度。
具体步骤为:首先,依旧是判断原数组是否有满足条件的连续子数组,若有则定义最大初始值min为原数组的长度,具体原因暴力法已说明;然后确定好滑动窗口(连续数组)的起始位置后,开始对滑动窗口的终止位置进行确定 ,一旦找到符合条件的连续数组的终止位置,立马倒回去调整滑动窗口的初始位置;最后反复进行第二个步骤,直到筛选出最小的长度。
代码示例:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值