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