[Leedcode][JAVA][第1248题][统计「优美子数组][找规律]
【问题描述】 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题][统计「优美子数组][找规律]相关推荐
- 1248. 统计「优美子数组」 前缀和
给你一个整数数组 nums 和一个整数 k. 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」. 请返回这个数组中「优美子数组」的数目. 示例 1: 输入:nums ...
- LeetCode 1248. 统计「优美子数组」(要复习)
文章目录 1. 题目 2. 解题 2.1 记录奇数出现的pos 2.2 前缀和 1. 题目 给你一个整数数组 nums 和一个整数 k. 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个 ...
- Leetcode--1248. 统计「优美子数组」(java)
给你一个整数数组 nums 和一个整数 k. 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」. 请返回这个数组中「优美子数组」的数目. 示例 1: 输入:nums ...
- [Leedcode][JAVA][第209题][长度最小的子数组][滑动窗口][前缀和][二分查找][双指针]
[问题描述][中等] 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的连续子数组,返回 0.示例: 输入: ...
- [Leedcode][JAVA][第466题][统计重复个数][数组]
[问题描述]466. 统计重复个数 由 n 个连接的字符串 s 组成字符串 S,记作 S = [s,n].例如,["abc",3]="abcabcabc".如果 ...
- [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]
[问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...
- [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]
[问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...
- [Leedcode][JAVA][第470题][Ran7()实现Rand10()]
[问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...
- Leetcode每日一题:1248.count-number-of-nice-subarrays(统计[优美子数组])
思路:这个题用数学方法还是挺容易想通,左右指针l,r分别指向符合count==k的子数组的两个奇数端点,统计l左边的偶数(包括l)和r右边的偶数(包括r),那么res+=二者的乘积:然后将l++,r+ ...
最新文章
- 如何在简历中添加自己的CSDN博客链接
- 基于VMwareWorkstation技术预览版2012上的WinServer8测试版安装
- Strophe的示例程序运行
- nginx 413 Request Entity Too Large
- element分页点击事件_关于原生dom事件添加、删除方法的一些拓展
- 码农提高工作效率(转载)
- vue3结合element-plus实现标签手动标注效果
- Java实现简单的文本编辑器
- eclipse使用配置教程
- word如何批量免费转PDF
- 数商云营销渠道管理系统解决方案:企业级营销系统类型、定位、管理
- 4大主流CPU处理器技术架构详解
- python实现之极限
- 入门机器学习需要会哪些编程语言?
- mac下的mysql的my.ini文件在哪里
- 矩阵(n阶方阵)的初等变换 初等矩阵 几何意义
- (4.1.40.5)Android手势检测GestureDecetor详解
- Color Space: Ycc
- 象棋对战js代码实现
- Superset执行「superset db upgrade」命令的报错记录
热门文章
- android app逆向分析,如何开始对Android应用的逆向分析?
- H5新增的标签和属性
- IDEA启动项目报错:Error:(1, 1) java: 非法字符: '\ufeff'
- Android 应用内实现导航页面,接入百度SDK内置导航,高德SDK内置导航
- vux radio 改造为 tree 代码片段
- 教程-上传应用公钥并获取支付宝公钥
- @EqualsAndHashCode()注解详解
- 关于操作系统的学习总结
- 通过web.xml文件自动启动spring容器加载对应的配置文件
- java弹出提示窗口_Java实现弹窗效果的基本操作(2)