题目链接🔗:长度最小的子序列
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
- 输入:s = 7, nums = [2,3,1,2,4,3]
- 输出:2
- 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
提示:
- 1 <= target <= 10^9
- 1 <= nums.length <= 10^5
- 1 <= nums[i] <= 10^5
暴力解法
正确代码✅
class Solution(object):
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
# 暴力法
result = float("inf") # 最终结果
sublen = 0 # 子序列长度
for i in range(len(nums)):
sum_arr = 0 # 数组和
for j in range(i,len(nums)):
sum_arr +=nums[j]
if sum_arr >= target:
sublen = j - i + 1
result = min(result,sublen)
break
if result == float("inf"):
result =0
else:
result = result
return result
思路: 两次遍历数组,记录每次大于目标和的子序列长度,取最小。
滑动窗口
正确代码✅
class Solution(object):
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
# 滑动窗口
sum_arr = 0 # 子序列的和
sublen = 0 # 子序列长度
result = float("inf") # 最终结果
i = 0
for j in range(len(nums)):
sum_arr += nums[j]
while sum_arr >= target:
sublen = j - i + 1
sum_arr -= nums[i]
i +=1
result = min(result,sublen)
if result==float("inf"):
result = 0
else:
result=result
return result
总结:滑动窗口就是暴力法的优化,具体的定义变量存储,基本一致,所以在理解滑动窗口的前提,还是理解暴力法,循序渐进才能更容易理解