題目描述
給你一個整數數組 nums 和一個整數 k。
如果某個 連續 子數組中恰好有 k 個奇數數字,我們就認爲這個子數組是「優美子數組」。
請返回這個數組中「優美子數組」的數目。
算法思路
說來慚愧,其實以前刷過這道題,但是死活想不起來了。
朦朧有些印象,這道題是有技巧的。
最終:
class Solution:
def numberOfSubarrays(self, nums, k: int) -> int:
ls=[0]+[i for i,j in enumerate(nums) if j%2]+[len(nums)-1]
if len(ls)<=k+1:return 0
beg,l,r,end=0,1,k,k+1
res=0
while end<len(ls):
if beg==0 and end==len(ls)-1:
res += (ls[end] - ls[r]+1) * (ls[l] - ls[beg] + 1)
elif beg==0:
res+=(ls[end]-ls[r])*(ls[l]-ls[beg]+1)
elif end==len(ls)-1:
res+=(ls[end]-ls[r]+1)*(ls[l]-ls[beg])
else:
res+=(ls[end]-ls[r])*(ls[l]-ls[beg])
beg,l,r,end=beg+1,l+1,r+1,end+1
return res
執行用時 :968 ms, 在所有 Python3 提交中擊敗了78.06%的用戶
內存消耗 :20.4 MB, 在所有 Python3 提交中擊敗了25.00%的用戶
做了一點小小的優化:
class Solution:
def numberOfSubarrays(self, nums, k: int) -> int:
ls=[-1]+[i for i,j in enumerate(nums) if j%2]+[len(nums)]
if len(ls)<=k+1:return 0
res=0
for i in range(len(ls)-k-1):
res+=(ls[i+k+1]-ls[i+k])*(ls[i+1]-ls[i])
return res
執行用時基本不變。