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

  • 相关阅读:
    【shell】日志切割
    【PHP】SVN版本差异导出
    Linux服务器上安装JDK
    Linux 下node环境安装
    CentOS 7.3安装mariadb
    Centos 7.4 自动初始化docker环境,配置docker镜像仓库
    Shell 模板 (Yes or NO)
    Linux修改时间和时区
    lvm方式挂载盘及扩容
    安装ansible
  • 原文地址:https://www.cnblogs.com/xiepl1997/p/13479763.html
Copyright © 2011-2022 走看看