用python刷LeetCode DAY 5
题目:209.长度最小的子数组
题目要求:
此题若使用暴力法,用两层for循环遍历数组,起始坐标为i,终点坐标为j,代码为
class Solution(object):
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
cur_sum = 0
result = float('inf') #先取结果为无穷大
for i in range(len(nums)):
cur_sum = 0
for j in range(i, len(nums)):
cur_sum += nums[j]
if cur_sum >= target:
result = min(result, j - i + 1) #若j-i+1比result小,则更新result
break # 跳出内循环
if result != float('inf'):
return result
else:
return 0
时间复杂度为 O ( n 2 ) O(n^2) O(n2),在LeetCode上提交会显示超时不通过,下面探寻一下更优的解法
上面是使用两层for循环遍历数组,导致时间复杂度很高,那我们能不能用一层for循环解此题呢,又要想到我们的双指针法,在此题中很像一个滑动的窗口,所以又叫滑动窗口法,因为文字描述比较困难,大家可以去B站看代码随想录的的解题思路视频
用python实现的代码如下:
class Solution(object):
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
cur_sum = 0
result = float('inf') # 先取结果为无穷大
i = 0
for j in range(len(nums)): # 终点坐标循环加一
cur_sum += nums[j]
while cur_sum >= target:
result = min(result, j - i + 1)
cur_sum = cur_sum - nums[i]
i += 1
if result == float('inf'): # 如果不存在符合条件的子数组,即result仍然为无穷大,则返回0。
return 0
else:
return result
时间复杂度降为 O ( n ) O(n) O(n)。