leetcode -- Minimum Size Subarray Sum -- 重点

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值