链接:1248. 统计「优美子数组」 - 力扣(LeetCode)
题解:1248. 统计「优美子数组」 - 力扣(LeetCode)
class Solution { public: int numberOfSubarrays(vector<int>& nums, int k) { if(nums.size() <= 0) { return 0; } vector<int> count(nums.size()+1, 0); // 比如count[i],下标i表示奇数个数,count[i]表示情况有多少种 //count[0]=1; int odd = 0; //累计前面到i位置,有奇数的个数pre[i],区间[0,i] int sum = 0; for(int i = 0; i < nums.size(); ++i) { // nums[i]是奇数 if(nums[i] & 1) { // 奇数数量增加 ++odd; } // 获得odd-k个个奇数,情况下种 if(odd == k) { sum += 1; } else if(odd > k) { sum += count[odd-k]; } // 奇数个数为odd的情况增加一种 ++count[odd]; } return sum; } };class Solution { public: int numberOfSubarrays(vector<int>& nums, int k) { int len = nums.size(); if (len <= 0) { return 0; } unordered_map<int, int> prefix; prefix[0] = 1; // 奇数数字出现0次的个数是1 int count = 0; int result = 0; for (int i = 0; i < len; ++i) { if (nums[i] % 2) { ++count; } if (count-k >= 0) { result += prefix[count-k]; } ++prefix[count]; } return result; } };count[0] = 1表示空前缀(还没取任何元素时)奇数个数为 0 这一情况已经出现了一次,用来正确处理从数组开头开始的子数组。