[LeetCode] 1248. Count Number of Nice Subarrays

Posted aaronliu1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 1248. Count Number of Nice Subarrays相关的知识,希望对你有一定的参考价值。

统计优美子数组。题意是给你一个整数数组 nums 和一个整数 k。如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。请返回这个数组中「优美子数组」的数目。例子,

Example 1:

Input: nums = [1,1,2,1,1], k = 3
Output: 2
Explanation: The only sub-arrays with 3 odd numbers are [1,1,2,1] and [1,2,1,1].

Example 2:

Input: nums = [2,4,6], k = 1
Output: 0
Explanation: There is no odd numbers in the array.

Example 3:

Input: nums = [2,2,2,1,2,2,1,2,2,2], k = 2
Output: 16

子数组的题一般可以试图往sliding window或者前缀和prefix sum上靠,本题我给出前缀和prefix sum的解法。思路是遍历input里面的每个数字,把他们的前缀和sum和出现次数加到hashmap里面,但是这一题跟560题的区别在于,560是在找一个特别的子数组的和K,而本题是在找有多少个包含K个奇数的子数组,他并不在意子数组的和或者长度是多少。所以思路是遇到奇数的时候可以把这个数字改成1,遇到偶数的时候可以把这个数字改成0。当累加prefix sum的时候,因为从0到当前位置的前缀和为sum,所以如果找到一个前缀和sum - K,则说明存在这样一个优美子数组

时间O(n)

空间O(n)

Java实现

 1 class Solution {
 2     public int numberOfSubarrays(int[] nums, int k) {
 3         int res = 0;
 4         int sum = 0;
 5         HashMap<Integer, Integer> map = new HashMap<>();
 6         map.put(0, 1);
 7         for (int i = 0; i < nums.length; i++) {
 8             sum += (nums[i] % 2 == 1) ? 1 : 0;
 9             map.put(sum, map.getOrDefault(sum, 0) + 1);
10             res += map.getOrDefault(sum - k, 0);
11         }
12         return res;
13     }
14 }

 

以上是关于[LeetCode] 1248. Count Number of Nice Subarrays的主要内容,如果未能解决你的问题,请参考以下文章

LEETCODE75第1248题 统计「优美子数组」

LeetCode1248. 统计「优美子数组」

LeetCode1074 / 560 / 1248 / 363 / 剑指 Offer 68 - II

leetcode 222.Count Complete Tree Nodes

⭐算法入门⭐《前缀和》中等03 —— LeetCode 1248. 统计「优美子数组」

leetcode之twosum