LeetCode 1248 统计[优美子数组](jekyll迁移)

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]使用上述方法计算将所有的个数加起来就是最后的解。

原文地址:https://www.cnblogs.com/xiepl1997/p/13479763.html