leetcode -- Minimum Size Subarray Sum -- 重点

时间:2021-01-10 04:29:31

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的方法,要再看看