[专题1:数组]滑动窗口:209.长度最小的子数组

题目描述:给定一个含有n个正整数的数组和一个正整数s,找出该数组中满足其和>=s的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回0。

  • 例如:
    • 输入s = 7, nums = [2, 3, 1, 2, 4, 3]
    • 输出:2
  • 暴力解法
    • 使用两层for循环从第一个元素开始求和,如果和大于s,记录下数组的长度。则第一层for循环从下一个元素开始求和,如果数组长度小于上一次的,更新最小长度,最后返回最小的数组长度。
def solve(nums, s):
    minlen = 0
    result = math.inf
    for i in range(len(nums)):
        sums = 0
        for j in range(i, len(nums)):
            sums += nums[j]
            if sums >= s:
                minlen = j - i + 1
                if result > minlen:
                    result = minlen
    return result
  • 时间复杂度:[专题1:数组]滑动窗口:209.长度最小的子数组
  • 空间复杂度:[专题1:数组]滑动窗口:209.长度最小的子数组

 

  • 滑动窗口:
    • 不断调节子序列的起始位置和终止位置。
    • 窗口:满足其和>=s的长度最小的连续子数组。

    • 起始位置:如果当前窗口的值大于s了,窗口就要向前移动了(缩小)。

    • 结束位置:结束位置就是遍历数组的指针。

def minSubArrayLen(self, target, nums):
    """
    :type target: int
    :type nums: List[int]
    :rtype: int
    """

    startindex = 0
    result = float('inf')
    sums = 0
    if sum(nums) < target:
        return 0    
    for i in range(len(nums)):
        sums += nums[i]
        while sums >= target:
            minlen = i - startindex + 1
            result = min(result, minlen)
            sums -= nums[startindex]
            startindex += 1
    return result
  • 时间复杂度:[专题1:数组]滑动窗口:209.长度最小的子数组
  • 空间复杂度:[专题1:数组]滑动窗口:209.长度最小的子数组

 

上一篇:Python模块之fileinput


下一篇:http协议详解