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;
        }
    };
    
  • 相关阅读:
    Web.xml中Filter过滤器标签几个说明
    JVM参数配置大全
    Java时间日期格式转换
    第一天用博客园
    Java基础--序列化和反序列化
    Java面试题2017
    固定布局,流动布局,弹性布局
    viewport
    索引
    Java虚拟机
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/12748667.html
Copyright © 2011-2022 走看看