LeetCode 1248 統計 優美子陣列

2021-10-05 07:47:55 字數 1547 閱讀 8428

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

這個題我是用雙指標做的,也就是所謂的滑動視窗,在這個視窗中保持k個奇數,然後查詢視窗左右兩邊偶數的個數,計算陣列的個數。

在這裡分享一下我看到的題解中所說的「字首和」的方法。這裡設定乙個字首和(即到當前元素為止,子陣列中奇數的個數)陣列arr,遍歷原陣列,每次遍歷,記錄當前的字首和。那麼該題的答案就是雙重迴圈arr[j] - arr[i] == k(j > i)的個數。但是對於該題而言是tle的,所以我們需要優化一下。

我們可以這樣優化,利用hashmap,key:字首和的大小value:字首和對應的陣列的個數。不過這裡字首和的大小是依次累加的,我們可以用prefix這樣乙個陣列來記錄。eg.prefix[3],表示字首和為3的陣列的個數;也就是有這麼多個陣列,其中奇數的個數為3。

上面說了,我們需要找的是arr[j] - arr[i] == k的個數,變換一下也就是arr[j] - k == arr[i],我們找的是要滿足該關係的所有陣列。假設我們已經遍歷到陣列的位置j,對於每乙個j而言,我們要找的是所有這樣的陣列,這些陣列arr[i] == arr[j] - k,也就是求prefix[arr[i]],且arr[i] == arr[j] - k。其實也不難理解,prefix[arr[j]]表示0...j這些元素組成的陣列有arr[j]個奇數,我們求arr[i] == arr[j] - k的陣列個數,也就是刪去前面的陣列0...i,使得i...j中包含k個奇數。prefix[arr[j] - k]就是指的前面被刪去的陣列的個數,刪去多少個,也就是剩下多少個含有k個奇數的連續子陣列。

舉個例子,假設到某個j的時候,arr[j] = 10,k = 7,那麼此時我們求的就是prefix[3]的數量,包含3個奇數的陣列有多少個,那麼包含7個奇數的陣列就有多少個。而這也正是我們所求的。

prefix[0] = 1是單獨定義的,比如,k = 3,此時也是乙個滿足條件的陣列,所以我們令其初值為1。

class solution 

return ans;

}};

Leetcode 1248 統計 優美子陣列

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

LeetCode1248 統計 優美子陣列

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

leetcode1248 統計優美子陣列

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