📜  使给定数组中最多 S 的数组求和的最小操作(1)

📅  最后修改于: 2023-12-03 15:07:00.146000             🧑  作者: Mango

使给定数组中最多 S 的数组求和的最小操作

假设有一个长度为N的数组nums和一个非负整数S,你需要找到一个最短的连续子数组,使得这个子数组的和大于等于S,返回这个最短的连续子数组的长度。

解法
方法一:暴力循环

对于每一个元素,从该元素开始往后遍历,并记录遍历过的子数组之和来寻找最小连续子数组的长度。该方法的时间复杂度为O(N^2)。

def minSubArrayLen(s: int, nums: List[int]) -> int:
    n=len(nums)
    ans=float("inf")
    for i in range(n):
        sumnums=0
        for j in range(i,n):
            sumnums+=nums[j]
            if sumnums>=s:
                ans=min(ans,j-i+1)
                break
    return ans if ans!=float("inf") else 0
方法二:滑动窗口

维护一个滑动窗口,通过双指针left和right来控制滑动窗口的大小。根据滑动窗口的大小来更新目标最小子数组长度。时间复杂度为O(N)。

def minSubArrayLen(s: int, nums: List[int]) -> int:
    n=len(nums)
    ans=float("inf")
    sumnums=0
    left=0
    for right in range(n):
        sumnums+=nums[right]
        while sumnums>=s:
            ans=min(ans,right-left+1)
            sumnums-=nums[left]
            left+=1
    return ans if ans!=float("inf") else 0
总结

滑动窗口方法时间复杂度更低,可以提高程序效率。应该尽可能的避免暴力循环的方式,优化方法代码,提升算法效率。