dmndxld

码不停题

滑动窗口法学习

刚才做了一道leecode题,要求是给定数组及数,返回最小的相邻子数组之和大于给定数的长度

这里我用循环套循环结果超出了时间限制,也就是说我的方法,时间复杂度很高,在遍历过程的一些信息被我丢失了

先贴代码

class Solution:
    def minSubArrayLen(self, s: int, nums: List[int]) -> int:
        n = len(nums)
        k,res,sum_i = -1,n+1,0
        for i in range(n):
            sum_i += nums[i]
            if sum_i >= s:
                while sum_i-nums[k+1] >= s:
                    sum_i -= nums[k+1]
                    k += 1
                res = min(res,i-k)
        if res == n+1:
            return 0
        else:
            return res

个人理解,就是用一个循环去替代原来的操作,减少时间复杂度。关键点就在于循环遍历时获取的信息,比如sum_i-nums[k+1]>=s这个信息要保存下来再判断,就像一个窗口一样不停滑动,这个窗口始终保持最小长度,也就是我需要的答案

另外,借鉴别人的分析,加以总结:

我们使用线性循环计算n个项中前k个元素的总和,并将总和存储在变量window_sum中。
然后,我们将在阵列上线性滑动直至达到最终并同时追踪最大和。
要获得k个元素块的当前总和,只需从前一个块中减去第一个元素并添加当前块的最后一个元素即可。

 

这样官方一点,不过我已经理解了。。。

posted on 2019-05-07 21:23  imyourterminal  阅读(1493)  评论(0编辑  收藏  举报

导航