1248 統計優美子數組(滑動窗口)

1. 問題描述:

給你一個整數數組 nums 和一個整數 k。

如果某個 連續 子數組中恰好有 k 個奇數數字,我們就認爲這個子數組是「優美子數組」。

請返回這個數組中「優美子數組」的數目。

示例 1:

輸入:nums = [1,1,2,1,1], k = 3
輸出:2
解釋:包含 3 個奇數的子數組是 [1,1,2,1] 和 [1,2,1,1] 。
示例 2:

輸入:nums = [2,4,6], k = 1
輸出:0
解釋:數列中不包含任何奇數,所以不存在優美子數組。
示例 3:

輸入:nums = [2,2,2,1,2,2,1,2,2,2], k = 2
輸出:16

提示:

  • 1 <= nums.length <= 50000
  • 1 <= nums[i] <= 10^5
  • 1 <= k <= nums.length

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/count-number-of-nice-subarrays

2. 思路分析:

① 比較容易想到的是先遍歷給出nums列表,將奇數添加到一個專門記錄奇數的列表中,然後我們可以通過遍歷這個奇數列表,計算出當前的第i個奇數與i - 1個奇數的對應的下標差值,這樣就可以計算出可以當前可以選擇的左邊的範圍是多少,同理可以計算出第i + k個奇數與i + k個奇數的上一個奇數對應的下標差值是多少,那麼就可以得到右邊可以選擇的範圍是多少,兩個差值相乘表示的意思是當前k個奇數可以選擇的子數組的數量

② 其實這個有點類似於滑動窗口的思想,只是這裏規定了窗口的具體的大小,所以我們可以逐個窗口進行移動計算即可

3. 代碼如下:

class Solution:
    def numberOfSubarrays(self, nums: List[int], k: int) -> int:
        odds = []
        # 左邊界
        odds.append(-1)
        # 往列表中添加元素可以使用append方法而不是使用下標訪問的方法
        for i in range(len(nums)):
            # 將奇數添加到列表之中, 使用與1相與的方法就可以判斷出是奇數還是偶數
            if nums[i] & 1 == 1:
                odds.append(i)
        # 右邊界
        odds.append(len(nums))
        index, res = 1, 0
        while index + k < len(odds):
            # 能夠選擇的種類爲區間相乘的乘積
            # odds[index]爲當前的奇數, odds[index - 1])爲上一個奇數, odds[index + k]爲第i + k個奇數
            # odds[index + k - 1]爲第i + k個奇數的上一個奇數
            res += (odds[index] - odds[index - 1]) * (odds[index + k] - odds[index + k - 1])
            index += 1
        return res

 

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