前綴和優化,時間複雜度O(n^2)超時
class Solution {
public:
int numberOfSubarrays(vector<int>& nums, int k) {
int n = nums.size();
int res = 0;
vector<int> pre(n+1);
for(int i=1;i<=n;i++){
pre[i] = pre[i-1];
if(nums[i-1]%2) pre[i]++;
}
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
if(pre[j+1]-pre[i]==k) res++;
}
}
return res;
}
};
前綴和加HashMap優化到O(n) (思路就是twoSum的優化思路)
class Solution {
public:
int numberOfSubarrays(vector<int>& nums, int k) {
int n = nums.size();
int res = 0;
vector<int> pre(n+1);
unordered_map<int,int> hashmap;
for(int i=1;i<=n;i++){
pre[i] = pre[i-1];
if(nums[i-1]%2) pre[i]++;
}
for(int i=0;i<=n;i++){
res+= hashmap[pre[i]-k];
hashmap[pre[i]]++;
}
return res;
}
};
可以用滑動窗口優化到時間O(n), 空間O(1), 不過有點難度。