1. 程式人生 > 其它 >【LeetCode】1248. 統計「優美子陣列」

【LeetCode】1248. 統計「優美子陣列」

1248. 統計「優美子陣列」

知識點:陣列;字首和

題目描述

給你一個整數陣列nums 和一個整數 k。

如果某個 連續 子陣列中恰好有 k 個奇數數字,我們就認為這個子陣列是「優美子陣列」。

請返回這個陣列中「優美子陣列」的數目

示例
輸入:nums = [1,1,2,1,1], k = 3
輸出:2
解釋:包含 3 個奇數的子陣列是 [1,1,2,1] 和 [1,2,1,1] 。

輸入:nums = [2,4,6], k = 1
輸出:0
解釋:數列中不包含任何奇數,所以不存在優美子陣列。

輸入:nums = [2,2,2,1,2,2,1,2,2,2], k = 2
輸出:16

解法一:字首和

又是連續子序列,想字首和,和560題:和為k的子陣列有區別嗎?其實是一模一樣的。前者是子陣列和為k,現在是子陣列奇數個數為k,換湯不換藥;直接字首和+雜湊表。

class Solution {
    public int numberOfSubarrays(int[] nums, int k) {
        Map<Integer,Integer> map = new HashMap<>();
        map.put(0,1);
        int count = 0;
        int presum = 0;
        for(int i = 0; i < nums.length; i++){
            presum += nums[i] % 2;   //統計奇數個數字首和;
            if(map.containsKey(presum-k)) count += map.get(presum-k);
            map.put(presum, map.getOrDefault(presum, 0)+1);
        }
        return count;
    }
}

時間複雜度:O(N);

體會

連續子陣列,想字首和。