[Leetcode][python]209. Minimum Size Subarray Sum

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值