【力扣】1248:統計[優美子數組]

題目描述

給你一個整數數組 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

執行用時基本不變。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章