【题目描述】

给你一个整数数组 ​​nums​​​ 和一个整数 ​​k​​​。如果某个连续子数组中恰好有 ​​k​​ 个奇数数字,我们就认为这个子数组是「优美子数组」。

请返回这个数组中 「优美子数组」 的数目。

​https://leetcode.cn/problems/count-number-of-nice-subarrays/​


【示例】

 【LeeCode】1248. 统计「优美子数组」_子数组

【代码】​​前缀和+HASH​

package com.company;
import java.util.*;

// 2023-03-02
class Solution {
public int numberOfSubarrays(int[] nums, int k) {
int len = nums.length;
if (len == 0) return 0;
int res = 0;
Map<Integer, Integer> map = new HashMap<>();
map.put(0, 1);
int count = 0;
for (int x : nums){
// 统计奇数个数
res += x & 1;
// 发现存在,则 count增加
if (map.containsKey(res - k)){
count += map.get(res - k);
}
map.put(res, map.getOrDefault(res, 0) + 1);
}
System.out.println(count);
return count;
}
}

public class Test {
public static void main(String[] args) {
new Solution().numberOfSubarrays(new int[]{1,1,2,1,1}, 3 ); // 输出:2
new Solution().numberOfSubarrays(new int[]{2,4,6}, 1 ); // 输出:0
new Solution().numberOfSubarrays(new int[]{2,2,2,1,2,2,1,2,2,2}, 2 ); // 输出:16
}
}

【代码】admin

package com.company;

import java.util.Arrays;
import java.util.Stack;

// 2022-02-16
class Solution {
public int longestOnes(int[] nums, int k) {
int len = nums.length;
int res = 0;
int left = 0;
int right = 0;
int sum = 0;
while (right < len){
if (nums[right] % 2 == 1) sum++;
while (sum == k){
res++;
if (nums[left] % 2 == 1) {
sum--;
}
left++;
}
// res = Math.max(res, right - left + 1);
right++;
}
System.out.println(res);
return res;
}
}

public class Test {
public static void main(String[] args) {
new Solution().longestOnes(new int[] {1,1,2,1,1}, 3); // 输出: 2
new Solution().longestOnes(new int[] {2, 4, 6}, 1); // 输出: 0
new Solution().longestOnes(new int[] {2,2,2,1,2,2,1,2,2,2}, 2); // 输出: 16
}
}

​​​​https://leetcode.cn/problems/subarray-sum-equals-k/solutions/562174/de-liao-yi-wen-jiang-qian-zhui-he-an-pai-yhyf/​