统计「优美子数组」

Posted by zhouqian on Sunday, July 24, 2022

力扣 1248. 统计「优美子数组」

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

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


方案一:使用前缀和配合无序映射。

func numberOfSubarrays(nums []int, k int) (ans int) {
    // 定义一个无序集合, key 为前缀和,val 为达到该前缀和的数组个数
    mp := make(map[int]int)
    // 0 表示什么元素都不加
    mp[0] = 1
    // 前缀和
    preSum := 0
    for _, num := range nums {
        // 通过 num % 2 将奇数变为 1, 偶数变为 0,方便计算 
        preSum += num % 2
        if v, ok := mp[preSum - k]; ok {
            ans += v
        }
        mp[preSum]++
    }
    return
}
  • 时间复杂度:O(n),因为需要遍历所有元素,并通过前缀和才能计算,所以时间复杂度为 O(n)。
  • 空间复杂度:O(n),因为使用了长度不超过 n 的无序映射以及常数级别的变量,所以空间复杂度为 O(n)。