题目:
In an array
A
of0
s and1
s, how many non-empty subarrays have sumS
?
Example 1:Input: A = [1,0,1,0,1], S = 2 Output: 4
Explanation: The 4 subarrays are bolded below:
[
1,0,1
,0,1]
[1,0,1,0
,1]
[1,0,1,0,1
]
[1,0,1,0,1
]Note:
A.length <= 30000
0 <= S <= A.length
A[i]
is either0
or1
.
解释:
维护一个一直在变化的hashMap。subarray求和,思想和560. Subarray Sum Equals K(python+cpp)是一样的。但是这个题目的一个特点是所有的元素只有0
和1
,所以总和的范围是0~len(nums),所以可以用一个长度为len(nums)+1
的数组来代替字典,速度会更快,注意初始化的时候preSumCount[0]=1
。
python代码:
class Solution:
def numSubarraysWithSum(self, A, S):
"""
:type A: List[int]
:type S: int
:rtype: int
"""
preSumCount=[0]*(len(A)+1)
preSumCount[0]=1
preSum=0
result=0
for a in A:
preSum+=a;
tmp=preSum-S
if tmp>=0:
result+=preSumCount[tmp]
preSumCount[preSum]+=1
return result
c++代码:
class Solution {
public:
int numSubarraysWithSum(vector<int>& A, int S) {
vector<int> preSumCount(A.size()+1,0);
preSumCount[0]=1;
int preSum=0;
int result=0;
for (auto a:A)
{
preSum+=a;
int tmp=preSum-S;
if (tmp>=0)
result+=preSumCount[tmp];
preSumCount[preSum]+=1;
}
return result;
}
};
总结: