剛才做了一道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個元素塊的當前總和,只需從前一個塊中減去第一個元素並添加當前塊的最后一個元素即可。
這樣官方一點,不過我已經理解了。。。