力扣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

⏳思路

利用滑动窗口 有点像计算机网络里传输数据滑动窗口协议 结合代码注释还是比较好理解

🔑题解

class Solution {
public:
    int numberOfSubarrays(vector<int>& nums, int k) {
        int n = (int)nums.size();
        int odd[n + 2], ans = 0, cnt = 0; // ans为答案  cnt 为奇数数组长度-1
        for (int i = 0; i < n; ++i) {
            if (nums[i] & 1) odd[++cnt] = i; // 此处 按位与 判断奇数
          	// 效果等同于 if(num[i] % 2 == 1) odd[++cnt] = i;
      	}
        // ☆ 对边界处理 ☆
      	odd[0] = -1, odd[++cnt] = n;
      
        for (int i = 1; i + k <= cnt; ++i) {
          // 第i个奇数与前一个奇数的间隔 * 第i+k-1个奇数与i+k个的间隔
          // 即是奇数下标的差值
            ans += (odd[i] - odd[i - 1]) * (odd[i + k] - odd[i + k - 1]); 
        }
        return ans;
    }
};
posted @ 2020-04-21 15:35  CoderZjz  阅读(206)  评论(0编辑  收藏  举报