返回
六六力扣刷题数组之长度最小的子数组
后端
2023-10-01 06:43:54
前言
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
之前小六六一直觉得自己的算法比较菜,算是一个短板吧,以前刷题也还真是三天打鱼,两台晒网,刷几天就觉得没啥意思了。不过,最近小六六发现,刷题其实也是一件很有意思的事情,特别是当你把一道题解出来的时候,那种成就感真的是爆棚!
所以,小六六决定,从今天开始,每天坚持刷题,直到把力扣上的所有题目都刷完为止!
今天,小六六要给大家分享一道数组题——长度最小的子数组。
题目
给定一个整数数组 nums 和一个目标值 target,请你寻找长度最小的子数组,其中子数组的和等于目标值 target。如果不存在这样的子数组,请返回 0。
解题思路
这道题乍一看上去,好像有点难,但其实解题思路并不复杂。我们可以使用滑动窗口的思想来解决这个问题。
滑动窗口的思想是这样的:我们先定义一个窗口,窗口的左边界和右边界分别指向数组中的两个元素。然后,我们将窗口向右移动,每次移动一个单位,同时计算窗口中元素的和。如果窗口中元素的和等于目标值 target,那么我们就找到了一个长度最小的子数组,其中子数组的和等于目标值 target。
如果我们找不到这样的子数组,那么我们就继续移动窗口,直到窗口的右边界到达数组的末尾。如果我们仍然找不到这样的子数组,那么我们就返回 0。
代码实现
def minSubArrayLen(target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
# 定义窗口的左边界和右边界
left = 0
right = 0
# 定义窗口中元素的和
window_sum = 0
# 定义最小长度
min_len = float('inf')
# 遍历数组
while right < len(nums):
# 将当前元素添加到窗口中
window_sum += nums[right]
# 如果窗口中元素的和大于等于目标值
while window_sum >= target:
# 更新最小长度
min_len = min(min_len, right - left + 1)
# 将窗口左边界右移
window_sum -= nums[left]
left += 1
# 将窗口右边界右移
right += 1
# 返回最小长度
return min_len if min_len != float('inf') else 0
复杂度分析
- 时间复杂度:O(n),其中 n 为数组 nums 的长度。
- 空间复杂度:O(1),因为我们只需要存储窗口中元素的和和窗口的左边界和右边界。
结语
这就是小六六给大家分享的长度最小的子数组这道题的解题思路和代码实现。希望大家能够喜欢!
如果你觉得这篇文章对你有所帮助,请不要忘记点赞和关注小六六哦!