时间:2020-06-26
题目地址:https://leetcode-cn.com/problems/minimum-size-subarray-sum
题目难度:Easy
题目描述:
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。
示例:
输入: s = 7, nums = [2,3,1,2,4,3]
输出:
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。
思路1:暴力破解
代码段1:超时
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
if(len(nums) == 0):return 0
result, num = 0, float('inf')
for i in range(0, len(nums)):
for j in range(i, len(nums)):
temp = 0
for k in range(i, j + 1):
temp += nums[k]
if(temp >= s):
num = min(num, j - i + 1)
break
return num if num != float('inf') else 0
总结:啊 这种写起来都费劲,妈呀
思路2:双指针,滑动窗口
代码段2:通过
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
left, right, temp, result, n = 0, 0, 0, float('inf'), len(nums)
while(right < n):
temp += nums[right]
right += 1
while(temp >= s):
result = min(result, right - left)
temp -= nums[left]
left += 1
return 0 if result == float('inf') else result
总结:啊 这种写起来都费劲,妈呀
后续优化:尝试O(n log n) 二分法