Giả sử cho một mảng A gồm các số 0 và 1, chúng ta phải tìm xem có bao nhiêu mảng con không rỗng có tổng S? Vì vậy, nếu đầu vào là [1,0,1,0,1] và S =2, thì kết quả sẽ là 4, vì các mảng con là [1,0,1,0,1], [1,0 , 1,0,1], [1,0,1,0,1], [1,0,1,0,1].
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Xác định một phương thức được gọi là atMost (), phương thức này sẽ nhận mảng A và số nguyên x
-
nếu x <0, thì trả về 0, đặt j:=0 và đặt ret:=0
-
cho tôi trong phạm vi từ 0 đến kích thước của A
-
giảm x đi A [i]
-
trong khi x <0
-
tăng x lên A [j], tăng j thêm 1
-
-
ret:=ret + i - j + 1
-
-
trả lại ret
-
Từ phương thức chính, thực hiện như sau -
-
ret:=atMost (A, S) - atMost (A, S - 1)
-
trả lại ret
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn &mius;
Ví dụ
#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));
} Đầu vào
[1,0,1,0,1]
Đầu ra
4