一. 题目描述
题目链接: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为原数组的长度,具体原因暴力法已说明;然后确定好滑动窗口(连续数组)的起始位置后,开始对滑动窗口的终止位置进行确定 ,一旦找到符合条件的连续数组的终止位置,立马倒回去调整滑动窗口的初始位置;最后反复进行第二个步骤,直到筛选出最小的长度。
代码示例: