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

  • 相关阅读:
    c# 子窗体打开或者切换就最大化
    TreeView失去焦点时亮显选中状态
    解决 RecursionError: maximum recursion depth exceeded
    CentOS7安装jdk1.8
    CentOS7安装mysql5.7
    CentOS7安装redis3.2.3
    CentOS7安装nginx1.8
    centos7设置redis开机自启动
    Linux下执行sh脚本报错:$' ': command not found
    Linux下使用unhide查看隐藏文件
  • 原文地址:https://www.cnblogs.com/xiepl1997/p/13479763.html
Copyright © 2011-2022 走看看