力扣1248 統計 優美子陣列 官方題解

2021-10-05 07:45:51 字數 1160 閱讀 3430

給你乙個整數陣列 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

解釋:數列中不包含任何奇數,所以不存在優美子陣列。

思路(官方題解)

這個題目中偶數其實是沒有用的,我們可以單獨建立乙個odd 陣列來記錄第 i個奇數的下標。那麼我們可以列舉奇數,假設當前列舉到第 i個,那麼 [odd[i],odd[i+k−1]] 這個子陣列就恰好包含 k個奇數。由於奇數和奇數間存在偶數,所以一定存在其他子陣列 [l,r]滿足 [l,r]包含 [odd[i],odd[i+k−1]] 且 [l,r]裡的奇數個數為 k個,那麼這個需要怎麼統計呢?

由於我們已經記錄了每個奇數的下標,所以我們知道對於第 i 個奇數,它的前乙個奇數的下標為 odd [i−1],也就是說(odd[i−1],odd[i]) 間的數都為偶數。同理可得(odd[i+k−1],odd[i+k]) 間的數也都為偶數。

那麼我們可以得出滿足 l∈(odd[i−1],odd[i]] 且 r∈[odd[i+k−1],odd[i+k]) 條件的子陣列[l,r] 包含 [odd[i],odd[i+k−1]] 且 [l,r]裡的奇數個數為 k 個。

因此對於第 i 個奇數,它對答案的貢獻為符合條件的[l,r] 的個數,即:

(odd[i] - odd[i - 1]) * (odd[i + k] - odd[i + k - 1])

我們只要遍歷一遍 odd 陣列即可求得最後的答案,注意邊界的處理。

int

numberofsubarrays

(vector<

int>

& nums,

int k)

}int ans=0;

odd[0]

=-1,odd[t++

]=n;

for(

int i=

1;i)return ans;

}

1248 統計 優美子陣列

給你乙個整數陣列 nums 和乙個整數 k。如果某個 連續 子陣列中恰好有 k 個奇數數字,我們就認為這個子陣列是 優美子陣列 請返回這個陣列中 優美子陣列 的數目。示例 1 輸入 nums 1,1,2,1,1 k 3 輸出 2 解釋 包含 3 個奇數的子陣列是 1,1,2,1 和 1,2,1,1 ...

1248 統計 優美子陣列

題解 class solution vectorcount nums.size 1,0 比如count i 下標i表示奇數個數,count i 表示情況有多少種 count 0 1 int odd 0 累計前面到i位置,有奇數的個數pre i 區間 0,i int sum 0 for int i 0...

Leetcode 1248 統計 優美子陣列

給你乙個整數陣列 nums 和乙個整數 k。如果某個 連續 子陣列中恰好有 k 個奇數數字,我們就認為這個子陣列是 優美子陣列 請返回這個陣列中 優美子陣列 的數目。示例 1 輸入 nums 1,1,2,1,1 k 3 輸出 2 解釋 包含 3 個奇數的子陣列是 1,1,2,1 和 1,2,1,1 ...