【LEETCODE】75、第1248题 统计「优美子数组」
2021-02-10 10:15
标签:ora array ext 递增 遇到 著作权 范围 The false 【LEETCODE】75、第1248题 统计「优美子数组」 标签:ora array ext 递增 遇到 著作权 范围 The false 原文地址:https://www.cnblogs.com/cutter-point/p/12743677.htmlpackage 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 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) {
//判断范围,判断窗口边缘是否是瞒住条件
if (isOdd(nums[j])) {
//如果j是奇数
ki++;
}
//判断窗口是否瞒住k个,并对窗口进行改变,要保证恰好有K个,多了少了都不行
while ((j - i + 1) >= k && ki == k) {
res++;
//如果瞒住了,那么从当前j到这个串的后续所有偶数都是符合的
for (int x = j + 1; x 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 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);
}
}
上一篇:线程池的停止
文章标题:【LEETCODE】75、第1248题 统计「优美子数组」
文章链接:http://soscw.com/index.php/essay/53515.html