陣列 滑動視窗

2022-09-22 02:09:10 字數 1213 閱讀 5553

給定乙個含有 n 個正整數的陣列和乙個正整數 target 。

找出該陣列中滿足其和 ≥ target 的長度最小的連續子陣列 [numsl, numsl+1, ..., numsr-1, numsr] ,並返回其長度。如果不存在符合條件的子陣列,返回 0 。

示例 1:

輸入:target = 7, nums = [2,3,1,2,4,3]

輸出:2

解釋:子陣列 [4,3] 是該條件下的長度最小的子陣列。

示例 2:

輸入:target = 4, nums = [1,4,4]

輸出:1

示例 3:

輸入:target = 11, nums = [1,1,1,1,1,1,1,1]

輸出:0

陣列操作中乙個重要的方法:滑動視窗。

所謂滑動視窗,也可以理解為雙指標法的一種,通過不斷的調節子串行的起始位置和終止位置,從而得出我們要想的結果。

主要確定如下三點:

如何移動視窗的起始位置?

如何移動視窗的結束位置?

class solution:

def minsubarraylen(self, target: int, nums: list[int]) -> int:

result = len(nums) + 1

sum = 0 # 滑動視窗數值之和

i = 0 # 滑動視窗起始位置

sublength = 0 # 滑動視窗的長度

for j in range(len(nums)):

sum = sum + nums[j]

# 注意這裡使用while,每次更新 i(起始位置),並不斷比較子串行是否符合條件

while sum >= target:

sublength = (j - i + 1) # 取子串行的長度

result = result if result < sublength else sublength

sum -= nums[i] # 這裡體現出滑動視窗的精髓之處,不斷變更i(子串行的起始位置)

i = i + 1

# 如果result沒有被賦值的話,就返回0,說明沒有符合條件的子串行

return (0 if result == (len(nums) + 1) else result)

時間複雜度:o(n)

空間複雜度:o(1)

陣列 滑動視窗

滑動視窗大多用於處理連續子陣列問題,然後得到相應的長度。例題 長度最小的子陣列 給定乙個含有 n 個正整數的陣列和乙個正整數 s 找出該陣列中滿足其和 s 的長度最小的連續子陣列。如果不存在符合條件的連續子陣列,返回 0。思路 使用滑動視窗i在左邊,j在右邊,明確意義 i,j 為滑動視窗 閉區間 如...

陣列 滑動視窗

leetcode 209.長度最小的子陣列 給定乙個含有 n 個正整數的陣列和乙個正整數 s 找出該陣列中滿足其和 s 的長度最小的 連續 子陣列,並返回其長度。如果不存在符合條件的子陣列,返回 0。示例 輸入 s 7,nums 2,3,1,2,4,3 輸出 2 解釋 子陣列 4,3 是該條件下的長...

陣列 滑動視窗

leetcode 209.長度最小的子陣列 給定乙個含有 n 個正整數的陣列和乙個正整數 s 找出該陣列中滿足其和 s 的長度最小的 連續 子陣列,並返回其長度。如果不存在符合條件的子陣列,返回 0。示例 輸入 s 7,nums 2,3,1,2,4,3 輸出 2 解釋 子陣列 4,3 是該條件下的長...