[Leetcode解題] 1248. Count Number of Nice Subarrays - 使用presum+hashtable解
22 June 2024
medium
array
presum
hash
hashtable
題目
1248. Count Number of Nice Subarrays
給定一個整數矩陣nums
和一個整數k
。如果一個連續子陣列包含恰好k
個奇數元素,則稱其為漂亮子陣列nice sub-arrays
。求全部漂亮子陣列的數量。
解題思路
這題的思路跟523蠻像的,我們都是要使用presum
搭配hashtable
來解題,這邊還有一些觀察,如果這邊的presum
紀錄的是從開始到當前索引的奇數數字數量,那它會是一個遞增數列,舉例來說:
原數列:[1,1,2,1,1,1]
計算開始到當前索引的奇數個數:[1,2,2,3,4,5], k = 3
當我們求出這個數列後,可以搭配hashtable
來記錄,每個回合我們要去找num - k
有沒有存在於hashtable
中,如果有的話,代表可以形成nice sub-arrays
,並且可以形成hashtable[num-k]
個。
以上面的例子舉例來說,在idx=4, num=4
的那個點,若k=3
,則要找hashtable
中有沒有1(4-3)
,有的話則代表有hashtable[1]
個nice sub-arrays
以4為結尾。
程式碼
class Solution(object):
def numberOfSubarrays(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
ht = {0: 1}
num_nice_arr = 0
cur = 0
for num in nums:
if num % 2 == 1:
cur += 1
ht.setdefault(cur, 0)
ht[cur] += 1
if cur - k in ht:
num_nice_arr += ht[cur-k]
return num_nice_arr
時間複雜度
所以我們只需進行一次迴圈,時間複雜度為$O(n)$