一.参考题目
二.暴力解法(经过检验,不论是哪种语言,使用暴力解法,对于大量复杂数据,都无法通过Leetcode的调试,都是超过时间限制的结果)
- 思路:两个for循环,然后不断的寻找符合条件的子序列
- 时间复杂度:O(n^2)
- 具体代码:
class Solution(object):
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
i,j=0,0
s=0
a=0
n=len(nums)
temp=n+1
for i in range(n):
for j in range(i,n):
s+=nums[j]
if s>=target:
a=j-i+1
temp=min(temp,a)
break
s=0
return temp if temp!=n+1 else 0
三.滑动窗口(双指针法的一种特殊情况)理论基础
- 滑动窗口的定义:不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果
- 滑动窗口解决问题的关键:
- 窗口内是什么?窗口就是满足题目要求的长度最小的连续子数组
- 如何移动窗口的起始位置?(解题的关键)如果当前窗口符合条件,窗口就要向前移动(也就是该缩小)
- 如何移动窗口的结束位置? 窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
- 滑动窗口的精妙之处是?根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)
四.滑动窗口解法代码实现
class Solution(object):
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
i,n=0,len(nums)
snum=0
temp=n+1
for j in range(n):
snum+=nums[j]
while snum>=target:
temp=min(temp,j-i+1)
snum-=nums[i]
i+=1
return temp if temp!=n+1 else 0
时间复杂度:O(n)
五.相关题目推荐