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...