难度:中等。
标签:数组,哈希表,前缀和,滑动窗口。
与昨天的题相似,将二元数组的前缀和计算出来,然后计算前缀和数组中,两个值差值为goal的组合个数。
正确解法:
class Solution {
int get(int a){
int ans = 0;
for(int i = 1; i <= a; ++i)ans += i;
return ans;
}
public:
int numSubarraysWithSum(vector<int>& nums, int goal) {
int n = nums.size();
vector<int> list;
list.emplace_back(0);
unordered_map<int, int> maps;
maps[0]++;
for(int i = 0; i < n; ++i){
int size = list.size();
if(nums[i] == 1)list.emplace_back(list[size - 1] + 1);
maps[list[list.size() - 1]]++;
}
/*cout << "list: ";
for(int i = 0; i < list.size(); ++i)cout << list[i] << " ";
cout << endl;
cout << "maps: " << endl;
for(auto it = maps.begin(); it != maps.end(); it++)cout << (*it).first << " " << (*it).second << endl;*/
int ans = 0;
for(int i = list.size() - 1; i >= 0; --i){
if(list[i] < goal)break;
if(goal == 0)ans += get(maps[list[i]] - 1);
else ans += maps[list[i]] * maps[list[i] - goal];
}
return ans;
}
};
结果: