西藏做網(wǎng)站找誰網(wǎng)站設(shè)計(jì)公司怎么樣
解題思路
一、滑動窗口
不斷右移 right 指針來擴(kuò)大滑動窗口,使其包含 k 個(gè)奇數(shù);
若當(dāng)前滑動窗口包含了 k 個(gè)奇數(shù),則如下「計(jì)算當(dāng)前窗口的優(yōu)美子數(shù)組個(gè)數(shù)」:
統(tǒng)計(jì)第 1 個(gè)奇數(shù)左邊的偶數(shù)個(gè)數(shù) leftEvenCnt。 這 leftEvenCnt 個(gè)偶數(shù)都可以作為「優(yōu)美子數(shù)組」的起點(diǎn),因此起點(diǎn)的選擇有 leftEvenCnt + 1 種(因?yàn)榭梢砸粋€(gè)偶數(shù)都不取,因此別忘了 +1 )。
統(tǒng)計(jì)第 k 個(gè)奇數(shù)右邊的偶數(shù)個(gè)數(shù) rightEvenCnt?。 這 rightEvenCnt 個(gè)偶數(shù)都可以作為「優(yōu)美子數(shù)組」的終點(diǎn),因此終點(diǎn)的選擇有 rightEvenCnt + 1 種(因?yàn)榭梢砸粋€(gè)偶數(shù)都不取,因此別忘了 +1 )。
因此「優(yōu)美子數(shù)組」左右起點(diǎn)的選擇組合數(shù)為 (leftEvenCnt + 1) * (rightEvenCnt + 1)。
class Solution: def numberOfSubarrays(self, nums: List[int], k: int) -> int: left = right = odd_cnt = res = 0 while right < len(nums): if nums[right] % 2 == 1: odd_cnt += 1 if odd_cnt == k: tmp = right while right < len(nums) and nums[right] % 2 == 0: right += 1 right_even_cnt = right - tmp left_even_cnt = 0 while left < len(nums) and nums[left] % 2 == 0: left_even_cnt += 1 left += 1 res += (left_even_cnt + 1) * (right_even_cnt + 1) left += 1 odd_cnt -= 1 right += 1 return res
參考鏈接:https://leetcode.cn/problems/count-number-of-nice-subarrays/solutions/213352/hua-dong-chuang-kou-qian-zhui-he-bi-xu-miao-dong-b/
?