【问题描述】 1248. 统计「优美子数组」

给你一个整数数组 nums 和一个整数 k。如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。请返回这个数组中「优美子数组」的数目。
示例 1:输入:nums = [1,1,2,1,1], k = 3
输出:2
解释:包含 3 个奇数的子数组是 [1,1,2,1] 和 [1,2,1,1] 。
示例 2:输入:nums = [2,4,6], k = 1
输出:0
解释:数列中不包含任何奇数,所以不存在优美子数组。
示例 3:输入:nums = [2,2,2,1,2,2,1,2,2,2], k = 2
输出:16

【解答思路】

1. 滑动窗口

时间复杂度:O(N) 空间复杂度:O(N)

public int numberOfSubarrays(int[] nums, int k) {int len = nums.length, res = 0, feed = 0, arr[] = new int[len + 2];for(int i = 0; i < len; i ++) {// if it is oddif((nums[i] & 1) == 1) {arr[++feed] = i;}}// left borderarr[0] = -1;// right borderarr[feed + 1] = len;for(int i = 1; i + k < feed + 2; i ++) {res += (arr[i] - arr[i - 1]) * (arr[i + k] - arr[i + k - 1]);}return res;
}
2. 双指针

计算前面的偶数个数,遍历时遇到偶数直接加进来就可以了

时间复杂度:O(N) 空间复杂度:O(1)

class Solution {public int numberOfSubarrays(int[] nums, int k) {if (nums == null || nums.length == 0 || nums.length < k) return 0;// 双指针int left = 0, right = 0;int count = 0; // 连续子数组中奇数的个数int res = 0;int preEven = 0; // 记录第一个奇数前面的偶数个数while (right < nums.length){// 连续子数组中奇数个数不够if (count < k){if (nums[right] % 2 != 0) count++;right++; // 移动右侧指针}// 连续子数组中奇数个数够了,看第一个奇数前面有多少个偶数if (count == k) {preEven = 0;while (count == k){res++;if (nums[left] % 2 != 0) count--;left++;preEven++;}} else res += preEven; // 每次遇到 right 为偶数的时候就进行累加 相当于区间前面偶数个数 * 后面偶数个数}return res;}
}

【总结】

1. 找规律题目 想好再动手
2. 数组思路 双指针 滑动窗口

参考链接:https://leetcode-cn.com/problems/count-number-of-nice-subarrays/solution/java-hua-dong-chuang-kou-xiang-jie-zhi-xing-yong-s/
参考链接:https://leetcode-cn.com/problems/count-number-of-nice-subarrays/solution/java-shuang-zhi-zhen-by-kelly2018/

[Leedcode][JAVA][第1248题][统计「优美子数组][找规律]相关推荐

  1. 1248. 统计「优美子数组」 前缀和

    给你一个整数数组 nums 和一个整数 k. 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」. 请返回这个数组中「优美子数组」的数目. 示例 1: 输入:nums ...

  2. LeetCode 1248. 统计「优美子数组」(要复习)

    文章目录 1. 题目 2. 解题 2.1 记录奇数出现的pos 2.2 前缀和 1. 题目 给你一个整数数组 nums 和一个整数 k. 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个 ...

  3. Leetcode--1248. 统计「优美子数组」(java)

    给你一个整数数组 nums 和一个整数 k. 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」. 请返回这个数组中「优美子数组」的数目. 示例 1: 输入:nums ...

  4. [Leedcode][JAVA][第209题][长度最小的子数组][滑动窗口][前缀和][二分查找][双指针]

    [问题描述][中等] 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的连续子数组,返回 0.示例: 输入: ...

  5. [Leedcode][JAVA][第466题][统计重复个数][数组]

    [问题描述]466. 统计重复个数 由 n 个连接的字符串 s 组成字符串 S,记作 S = [s,n].例如,["abc",3]="abcabcabc".如果 ...

  6. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

    [问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...

  7. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  8. [Leedcode][JAVA][第470题][Ran7()实现Rand10()]

    [问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...

  9. Leetcode每日一题:1248.count-number-of-nice-subarrays(统计[优美子数组])

    思路:这个题用数学方法还是挺容易想通,左右指针l,r分别指向符合count==k的子数组的两个奇数端点,统计l左边的偶数(包括l)和r右边的偶数(包括r),那么res+=二者的乘积:然后将l++,r+ ...

最新文章

  1. 如何在简历中添加自己的CSDN博客链接
  2. 基于VMwareWorkstation技术预览版2012上的WinServer8测试版安装
  3. Strophe的示例程序运行
  4. nginx 413 Request Entity Too Large
  5. element分页点击事件_关于原生dom事件添加、删除方法的一些拓展
  6. 码农提高工作效率(转载)
  7. vue3结合element-plus实现标签手动标注效果
  8. Java实现简单的文本编辑器
  9. eclipse使用配置教程
  10. word如何批量免费转PDF
  11. 数商云营销渠道管理系统解决方案:企业级营销系统类型、定位、管理
  12. 4大主流CPU处理器技术架构详解
  13. python实现之极限
  14. 入门机器学习需要会哪些编程语言?
  15. mac下的mysql的my.ini文件在哪里
  16. 矩阵(n阶方阵)的初等变换 初等矩阵 几何意义
  17. (4.1.40.5)Android手势检测GestureDecetor详解
  18. Color Space: Ycc
  19. 象棋对战js代码实现
  20. Superset执行「superset db upgrade」命令的报错记录

热门文章

  1. android app逆向分析,如何开始对Android应用的逆向分析?
  2. H5新增的标签和属性
  3. IDEA启动项目报错:Error:(1, 1) java: 非法字符: '\ufeff'
  4. Android 应用内实现导航页面,接入百度SDK内置导航,高德SDK内置导航
  5. vux radio 改造为 tree 代码片段
  6. 教程-上传应用公钥并获取支付宝公钥
  7. @EqualsAndHashCode()注解详解
  8. 关于操作系统的学习总结
  9. 通过web.xml文件自动启动spring容器加载对应的配置文件
  10. java弹出提示窗口_Java实现弹窗效果的基本操作(2)