https://leetcode.com/problems/minimum-size-subarray-sum/
这里一开始想的是,可以用i,j指向0,0,然后j往前走,直到sum>=s. 随后再令i = j, mysum = 0,循环上一步操作。
但是忽略了11, [1,2,3,4,5]这样的case。供自己复习。
class Solution(object):
def minSubArrayLen(self, s, nums):
""" :type s: int :type nums: List[int] :rtype: int """
i,j = 0,0
res = len(nums)
while j<len(nums):
mysum = 0
while j < len(nums) and mysum < s:
mysum += nums[j]
j += 1
res = min(res, j - i)
i = j
return res
这里正确的思路应该是当mysum >=s之后,mysum - nums[i], i往前走一步,然后j继续往前走。循环
两个指针, start end, end向后走,直到 sum 大于 s. 然后start向后, 直到sum 小于s. 同时更新 min值.
这里相当于区间的右边往前走,直到mysum>target, 然后左边往前走。。。。
参考http://bookshadow.com/weblog/2015/05/12/leetcode-minimum-size-subarray-sum/
http://blog.csdn.net/xudli/article/details/45715257
class Solution(object):
def minSubArrayLen(self, s, nums):
""" :type s: int :type nums: List[int] :rtype: int """
i,j = 0,0
res = len(nums) + 1 #这里要注意初始化成len(nums) + 1
mysum = 0
while j < len(nums):
while j < len(nums) and mysum < s:
mysum += nums[j]
j += 1
while i < j and mysum >= s:#这里也是要循环的,要注意是i<j,没有等号。其实有等号也可以过
res = min(res, j - i)
mysum -= nums[i]
i += 1
return [0,res][res <= len(nums)]
还有BS的方法,要再看看