滑動窗口法學習


剛才做了一道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個元素塊的當前總和,只需從前一個塊中減去第一個元素並添加當前塊的最后一個元素即可。

 

這樣官方一點,不過我已經理解了。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM