# 「力扣」第 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

# 方法:前缀和

  • count 是哈希表,它记录了:key :前缀里包含的奇数个数,value :出现了多少次。

参考代码

public class Solution {

    public int numberOfSubarrays(int[] nums, int k) {
        int len = nums.length;
        int[] count = new int[len + 1];
        count[0] = 1;
        int res = 0;
        int preSum = 0;
        for (int num : nums) {
            // preSum += (num % 2 == 1 ? 1 : 0);
            preSum += (num & 1);
            count[preSum]++;
            if (preSum >= k) {
                res += count[preSum - k];
            }
        }
        return res;
    }
}

复杂度分析

  • 时间复杂度:
  • 空间复杂度:。

作者:liweiwei1419 链接:https://suanfa8.com/prefix-sum/solutions-1/1248-count-number-of-nice-subarrays 来源:算法吧 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Last Updated: 11/19/2024, 7:59:29 AM