zoukankan      html  css  js  c++  java
  • 【LeetCode】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

    思路一:数学

    代码

    时间复杂度:O(n)
    空间复杂度:O(n)

    class Solution {
    public:
        int numberOfSubarrays(vector<int>& nums, int k) {
            int size = nums.size(), cnt = 0, res = 0;
            vector<int> odd(size + 2);
            odd[0] = -1;
            for (int i = 0; i < size; ++i) {
                if (nums[i] & 1) odd[++cnt] = i;
            }        
            odd[++cnt] = size;
            for (int i = 1; i + k <= cnt; ++i) {
                res += (odd[i] - odd[i - 1]) * (odd[i + k] - odd[i + k - 1]);
            }
            return res;
        }
    };
    

    思路二:前缀和

    代码

    时间复杂度:O(n)
    空间复杂度:O(n)

    class Solution {
    public:
        int numberOfSubarrays(vector<int>& nums, int k) {
            vector<int> csum(nums.size() + 1);
            csum[0] = 1;
            int res = 0, sum = 0;
            for (int i = 0; i < nums.size(); ++i) {
                sum += nums[i] & 1;
                if (sum >= k) res += csum[sum - k];
                ++csum[sum];
            }
            return res;
        }
    };
    
  • 相关阅读:
    11.4 final类
    11.3 final方法
    【GIS】GIS坐标系
    【其他】短信轰炸
    【js】js传递对象
    【注解】Autowired
    【js】vue.js v-model
    【问题】ajax两种传递id值方式的区别
    【随笔】6.高筑墙 广积粮 缓称王
    【随笔】5.多恩亲王 Red Viper 奥伯伦之死。
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/12748667.html
Copyright © 2011-2022 走看看