优美子数组

思路
先计算前缀中pre奇数个数。
利用map存储,pre[i]的个数,
查找时是由pre[i]-k
int numberOfSubarrays(vector<int>& nums, int k) {
int sz = nums.size();
if (0 == sz) return 0;
std::vector<int> pre;
pre.resize(sz, 0);
if (nums[0] % 2 != 0) pre[0] = 1;
for(int i = 1; i < sz; ++i) {
if (nums[i] % 2 != 0) {
pre[i] = pre[i - 1] + 1;
} else {
pre[i] = pre[i - 1];
}
}
std::unordered_map<int, int> map;
map[0] = 1;
int count = 0;
for (int i = 0; i < sz; i++) {
auto iter = map.find(pre[i] - k);
if (iter != map.end()) {
count += iter->second;
}
iter = map.find(pre[i]);
if (iter != map.end()) {
map[pre[i]] += 1;
}else{
map[pre[i]] = 1;
}
}
return count;
}

浙公网安备 33010602011771号