題目連結(jié):
題目意譯:
給定一個(gè)整數(shù)陣列 nums 以及一個(gè)整數(shù) k。如果一個(gè)連續(xù)子陣列裡有著恰好 k 個(gè)奇數(shù)存在,則其將為一個(gè)好的子陣列。
回傳好的子陣列之?dāng)?shù)量。
限制:
1 ≦ nums.length ≦ 50000
1 ≦ nums[i] ≦ 10 ^ 5
1 ≦ k ≦ nums.length
範(fàn)例測(cè)資:
範(fàn)例 1:
輸入: nums = [1,1,2,1,1], k = 3
輸出: 2
解釋: 有著 3 個(gè)奇數(shù)的好的子陣列為 [1,1,2,1] 和 [1,2,1,1]。
範(fàn)例 2:
輸入: nums = [2,4,6], k = 1
輸出: 0
解釋: 陣列中不存在任何好的子陣列。
範(fàn)例 3:
輸入: nums = [2,2,2,1,2,2,1,2,2,2], k = 2
輸出: 16
解題思維:
典型的滑動(dòng)視窗(Sliding Window)之題型,如
這題。
首先先找到包含由左至右掃過(guò)的前 k 個(gè)奇數(shù)(如果找不到則直接回傳 0),假設(shè)結(jié)束於位置 i。因此此時(shí)的視窗為 [0, i]。
然後接著我們想要求在以位置 i 作為結(jié)尾的情況下,有多少好的子陣列。而這可以藉由將視窗的左端點(diǎn)一直往右移直到不能再移動(dòng)為止(即一旦再次移動(dòng),子陣列中的奇數(shù)個(gè)數(shù)將不滿 k 個(gè))。設(shè)此時(shí)的視窗為 [L, i],則可以看到以位置 i 作為結(jié)尾的好的子陣列之個(gè)數(shù)為 L + 1 個(gè)。
接著,我們想要為位置 i + 1 、 i + 2 等做類似的事情。注意到這些子陣列的一開始的左端點(diǎn)是 L',而這些 L' 是繼承於前一個(gè)子陣列的(因?yàn)樵偻髸?huì)太多個(gè)奇數(shù))。因此其後找到的新的左端點(diǎn) L 時(shí),數(shù)量為 L - L' + 1 個(gè)。
最後將這些位置的子陣列數(shù)量加總即為所求。
此次分享到此為止,如有任何更加簡(jiǎn)潔的想法或是有說(shuō)明不清楚之地方,也煩請(qǐng)各位大大撥冗討論。