leetcode 209 長度最小的子陣列

2021-10-08 19:29:05 字數 2743 閱讀 3245

209. 長度最小的子陣列

給定乙個含有 n 個正整數的陣列和乙個正整數 s ,找出該陣列中滿足其和 ≥ s 的長度最小的 連續 子陣列,並返回其長度。如果不存在符合條件的子陣列,返回 0。

示例:輸入:s = 7, nums = [2,3,1,2,4,3]

輸出:2

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

高階:如果你已經完成了 o(n) 時間複雜度的解法, 請嘗試 o(n log n) 時間複雜度的解法。

下面是滑動視窗法:每次加乙個新數進來,如果和大於s,那麼計算區間長度,每一取乙個最小的區間長度。

如果和大於s,那麼就需要縮小左邊界,並且判斷縮小之後 的總和是否滿足大於等於s。

每次不滿足總和大於等於s,我們就要右移right, 加入乙個新的數進來。

class

solution

:def

minsubarraylen

(self, s:

int, nums: list[

int])-

>

int:

n =len(nums)

length =

float

('inf'

) left, right =0,

0 ans =

0while right < n:

ans += nums[right]

while ans >= s:

if right +

1- left < length:

length =

min(right +

1- left, length)

ans -= nums[left]

left +=

1 right +=

1return length if length !=

float

('inf'

)else

0

下面是powcai大佬的二分法:

num[i]的值是前i個數的總和, nums[j] - nums[i]就是( j , i ]的總和,所以我們可以使用二分進行區間縮小。

區間的上界就是所有數的總和,下界就是s。

class

solution

:def

minsubarraylen

(self, s:

int, nums: list[

int])-

>

int:

ifnot nums :

return

0# 求字首和

for i in

range(1

,len

(nums)):

nums[i]

+= nums[i -1]

#print(nums)

# 總和都小於 s 時候

if nums[-1

]< s:

return

0 res =

float

("inf"

) nums =[0

]+ nums

for i in

range(1

,len

(nums)):

if nums[i]

- s >=0:

# 二分查詢

loc = bisect.bisect_left(nums, nums[i]

- s)

if nums[i]

- nums[loc]

>= s:

res =

min(res, i - loc)

continue

if loc >0:

res =

min(res, i - loc +1)

return res

sum/solution/hua-dong-chuang-kou-on-er-fen-fa-onlogn-by-powcai/

官方題解:

class

solution

:def

minsubarraylen

(self, s:

int, nums: list[

int])-

>

int:

ifnot nums:

return

0

n =len(nums)

ans = n +

1 sums =[0

]for i in

range

(n):-1

]+ nums[i]

)for i in

range(1

, n +1)

: target = s + sums[i -1]

bound = bisect.bisect_left(sums, target)

if bound !=

len(sums)

: ans =

min(ans, bound -

(i -1)

)return

0if ans == n +

1else ans

sum/solution/chang-du-zui-xiao-de-zi-shu-zu-by-leetcode-solutio/

leetcode 209 長度最小的陣列

題目描述 給定乙個含有 n 個正整數的陣列和乙個正整數 s 找出該陣列中滿足其和 s 的長度最小的連續子陣列。如果不存在符合條件的連續子陣列,返回 0。參考 負雪明燭 class solution object def minsubarraylen self,s,nums type s int ty...

LeetCode 209 長度最小的子陣列

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

Leetcode209 長度最小的子陣列

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