【LEETCODE】75、第1248题 统计「优美子数组」
时间:2020-04-21
本文章向大家介绍【LEETCODE】75、第1248题 统计「优美子数组」,主要包括【LEETCODE】75、第1248题 统计「优美子数组」使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
package array.medium; /** * @Auther: xiaof * @Date: 2020/4/21 10:48 * @Description: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 <= nums.length <= 50000 * 1 <= nums[i] <= 10^5 * 1 <= k <= nums.length * * 来源:力扣(LeetCode) * 链接:https://leetcode-cn.com/problems/count-number-of-nice-subarrays * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 */ public class NumberOfSubarrays { public int solution(int[] nums, int k) { int i = 0, j = 0, ki = 0, res = 0; while (i < nums.length && j < nums.length) { //判断范围,判断窗口边缘是否是瞒住条件 if (isOdd(nums[j])) { //如果j是奇数 ki++; } //判断窗口是否瞒住k个,并对窗口进行改变,要保证恰好有K个,多了少了都不行 while ((j - i + 1) >= k && ki == k) { res++; //如果瞒住了,那么从当前j到这个串的后续所有偶数都是符合的 for (int x = j + 1; x < nums.length; ++x) { if (!isOdd(nums[x])) { res++; } else break; } // res++; //然后判断前面的窗口进行递增 if (isOdd(nums[i])) { ki--; } i++; } ++j; } //去掉全集 return res; } private boolean isOdd(int n) { //判断是否是奇数 if ((n & 1) == 0) { return false; } else { return true; } } 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; } public static void main(String[] args) { NumberOfSubarrays fuc = new NumberOfSubarrays(); int nums1[] = {2,2,2,1,2,2,1,2,2,2}, k1 = 2; int nums2[] = {1,1,2,1,1}, k2 = 3; int nums3[] = {45627,50891,94884,11286,35337,46414,62029,20247,72789,89158,54203,79628,25920,16832,47469,80909}, k3 = 1; fuc.solution(nums3, k3); // fuc.numberOfSubarrays(nums2, k2); } }
原文地址:https://www.cnblogs.com/cutter-point/p/12743677.html
- Oracle基础知识-oracle常用命令
- 【java开发系列】—— JDK安装
- 【java开发系列】—— struts2简单入门示例
- JAVA利用poi获取world文件内容
- Oracle基础知识-数据迁移
- JAVA利用jxl读取Excel内容
- JAVA利用jxl读取Excel内容
- 【java开发系列】—— 自定义注解
- CSS 特殊属性介绍之 pointer-events
- 【java开发系列】—— 集合使用方法
- Elasticsearch安装
- 【java开发系列】—— 深克隆和浅克隆
- 【java开发系列】—— JDOM创建、修改、删除、读取XML文件
- AngularJs ng-route路由详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python3.7调试的实例方法
- Laravel框架控制器,视图及模型操作图文详解
- PHP实现带进度条的Ajax文件上传功能示例
- 基于selenium及python实现下拉选项定位select
- PHP rmdir()函数的用法总结
- thinkphp5修改view到根目录实例方法
- openCV提取图像中的矩形区域
- PHP二维索引数组的遍历实例分析【2种方式】
- Selenium及python实现滚动操作多种方法
- PHP使用JPGRAPH制作圆柱图的方法详解
- PHP 实现超简单的SESSION与COOKIE登录验证功能示例
- PHP 图像处理与SESSION制作超简单验证码的方法示例
- 简述PHP7.4 新特性和废弃的功能
- laravel5.1框架下的批量赋值实现方法分析
- Laravel框架环境与配置操作实例分析