layout: post
title: LeetCode 1248 统计[优美子数组]
date: 2019-11-04
author: xiepl1997
tags: 敲敲敲
给你一个整数数组 nums 和一个整数 k 。
如果某个连续的子数组中恰好有 k 个奇数数字,我们就认为这个子数组是优美子数组。
请返回这个数组中优美子数组的数目。
分析
例如给出数组
0 1 1 0 1 0 0 1 0
给出 k = 3
很容易可以得出的两个两端都为奇数的符合要求的子数组:
(1)1 1 0 1
and
(2)1 0 1 0 0 1
由此来进行扩展:
首先对于(1),左端可以选择扩展 1 位或者不扩展,所以一共有 2 种选择。右端可以选择扩展 1 位、2 位或者不扩展,扩展 3 位的话就把第 7 位的“1”也收纳进来了,这样的话就包含了不止 3 个奇数了。
所以(1)子数组有 2 * 3=6 种合法情况。
对于(2),左端不能扩展,右端可以扩展 1 位或者不扩展。
所以(2)子数组有 2 种合法情况。
对于该例子,一共有 6+2=8 个优美子数组
解决
定义一个临时数组temp,用于存储数组中的奇数下标。
还是对于数组0 1 1 0 1 0 0 1 0
,它的temp数组为-1 1 2 4 7 9
为什么temp数组两端分别为 -1 和 9 呢? -1 和 9 为数组的边界,对于(1),用它第一个奇数的下标减去 -1 这个边界,就等于(1)子数组的左边的可扩展数1-(-1)=2,而(1)右端的可扩展数为 7-4=3,所以以(1)子数组为窗口滑动产生的“优美子数组”个数为:
(temp[i]-temp[i-1])*(temp[i+k]-temp[i+k-1])
所以对temp数组进行遍历,对每个temp[i]使用上述方法计算将所有的个数加起来就是最后的解。