209. Minimum Size Subarray Sum
知识点:two pointers
1.原题
Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn’t one, return 0 instead.
Example:
Input: s = 7, nums = [2,3,1,2,4,3]
Output: 2
Explanation: the subarray [4,3] has the minimal length under the problem constraint.
Follow up:
If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log n).
2. 题意
找到一个array中连续的子串,其sum≥ s并且长度最短
3. 思路
我一开始没想到怎么使用双指针,结果写出的代码就Time Limit Exceeded了。随后学到了别人对双指针的使用方式。是将两个指针作为sliding window的两边,当左边不动,右边向右划动,直到找到sum≥ s,将它的长度和之前的min长度做对比并存储较小的那个作为目前的最小长度;之后将左边向右滑动一个数字,再看现在的window的sum≥ s是否成立,若成立,则更新最小长度;否则,将右边向右滑动知道新的window的sum≥ s,再更新最小长度。
4. 代码
4.1 没有使用双指针Time Limit Exceeded
class Solution(object):
def minSubArrayLen(self, s, nums):
"""
:type s: int
:type nums: List[int]
:rtype: int
"""
n=nums
l=len(n)
an=[]
st=0
y=0
for i in range(l):
st=n[i]
if st>=s:
return 1
for j in range(i+1,l):
st=st+n[j]
if st>=s:
an.append(j-i+1)
y=1
break
an.sort()
if y==1:
return an[0]
return 0
4.2 使用双指针 AC
class Solution(object):
def minSubArrayLen(self, s, nums):
"""
:type s: int
:type nums: List[int]
:rtype: int
"""
n=nums
l=len(n)
an=float('inf')
a,b=0,0
su=0
for b in range(l):
su=su+n[b]
while su>=s:
an=min(an,b-a+1)
su=su-n[a]
a=a+1
if an==float('inf'):
return 0
else:
return an
5. Reference
https://blog.csdn.net/fuxuemingzhu/article/details/83063096