C ++中具有和的二进制子数组
假设给定的数组A为0和1,我们必须找到多少个非空子数组的总和为S?因此,如果输入类似于[1,0,1,0,1],并且S=2,则结果将为4,因为子数组为[1,0,1,0,1],[1,0,1,0,1],[1,0,1,0,1],[1,0,1,0,1]。
为了解决这个问题,我们将遵循以下步骤-
定义一个名为的方法atMost(),它将采用数组A和整数x
如果x<0,则返回0,设置j:=0并设置ret:=0
对于范围从0到A的i
将x增加A[j],将j增加1
将x减少A[i]
而x<0
ret:=ret+i–j+1
返回ret
从主要方法中执行以下操作-
ret:=atMost(A,S)–atMost(A,S–1)
返回ret
让我们看下面的实现,以更好地理解&mius;。
示例
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int atMost(vector <int>& A, int x){
if(x < 0) return 0;
int j = 0;
int ret = 0;
for(int i = 0; i < A.size(); i++){
x -= A[i];
while(x < 0){
x += A[j];
j++;
}
ret += i - j + 1;
}
return ret;
}
int numSubarraysWithSum(vector<int>& A, int S) {
return atMost(A, S) - atMost(A, S - 1);
}
};
main(){
vector<int> v1 = {1,0,1,0,1};
Solution ob;
cout << (ob.numSubarraysWithSum(v1, 2));
}输入值
[1,0,1,0,1]
输出结果
4