zoukankan      html  css  js  c++  java
  • 209. Minimum Size Subarray Sum

    https://leetcode.com/problems/minimum-size-subarray-sum/#/description

    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.

    For example, given the array [2,3,1,2,4,3] and s = 7,
    the subarray [4,3] has the minimal length under the problem constraint.

     

    Sol 1:

    Two pointer.

    class Solution(object):
        def minSubArrayLen(self, s, nums):
            """
            :type s: int
            :type nums: List[int]
            :rtype: int
            """
            
            # two pointers
            if len(nums) == 0:
                return 0
            
            sum = 0
            i = 0
            # fast pointer j
            j = 0
            res = len(nums) + 1
            while sum < s:
                sum += nums[j]
                j += 1
                
                # to enter the while loop below, sum is greater than s, now let's use another pointer i(slow) pointer to find the intervals between i and j.  
                
                while sum >= s:
                    # if i and j still have elements among them
                    if  res > j - i:
                        res = j - i
                    sum -= nums[i]
                    i += 1
                    
                    
                if j == len(nums):
                    break
            
            # if sum > s at the very beginning, then the program will not enter the first while loop. Thus 0 will be returned. 
            if res > len(nums):
                return 0
            
            return res
                

    Sol 2:

    Precalculated sums saved at the same list.  i.e. replace the input list.

    class Solution(object):
        def minSubArrayLen(self, s, nums):
            """
            :type s: int
            :type nums: List[int]
            :rtype: int
            """
            
            # Precalculated sums saved at the same list
            
            sm = sum(nums)
            if sm < s:
                return 0
            for i in range(len(nums)):
                # it is like create a new list, but actually it is in place.(some algorithm here.name?)
                nums[i], sm = sm, sm - nums[i]
            res = len(nums)
            
            # complete the difference list
            nums.append(0)
            # traverse nums backwards, but traverse order does not matter
            # for i in range(len(nums)-1, -1, -1):
            for i in range(len(nums)):
                if nums[i] >= s:
                    j = min(len(nums)-1, i + res - 1)
                    while nums[i] - nums[j] >= s:
                        res = j - i
                        j -= 1
            return res
            
  • 相关阅读:
    实现简单HttpServer案例
    实现简单Mybatis案例
    python 判断文件和文件夹是否存在的方法 和一些文件常用操作符
    常用模块学习
    python格式化输出
    ubuntu 配置vim编辑器
    linux 安装python3.x
    python属性限制 __slots__
    选课系统作业
    通过sorted获取dict的所有key值或者value值
  • 原文地址:https://www.cnblogs.com/prmlab/p/7148125.html
Copyright © 2011-2022 走看看