题目描述
思路
进行思路转化。使用前缀和进行计算。
如果前i个数 有5个奇数,前j个数有10个奇数,那么子数组i j之间为arr[j] - arr[i] = 5个奇数。
即是求解 arr[j] - arr[i] == k TWOSUM
伪代码
//step1
//求arr[0~n-1] 代表以下标结尾奇数个数
for 0 ~ n-1
arr.pushback(arr.back()+nums[i]&1)
//twoSum
unordered_map<int,int> has
for num:nums
res += has[num-k]
has[num]++
代码
class Solution {
public:
//贪心 //前缀和 + hash
//思路 arr[j] = 表示 前面j个数字有arr[j] 个奇数,arr[i] 前面i个数字 有arr[i] 个奇数。
//例子 arr[5] = 3 arr[10] = 9,那么奇数5~10 之间有7个数字
int numberOfSubarrays(vector<int>& nums, int k) {
vector<int> arr;
arr.push_back(0);
for(auto num:nums)
{
arr.push_back(arr.back() + (num&1));
}
unordered_map <int,int> hash;
int res=0;
for(auto num:arr)
{
//num - k 的值为多少, 即是多少个奇数。
res += hash[num-k];
hash[num]++;
}
return res;
}
};
重难点
问题的转化。
hashmap的使用