ধরুন 0 এবং 1s এর একটি অ্যারে দেওয়া হল, আমাদের খুঁজে বের করতে হবে কতগুলি অ-খালি সাবয়ারের যোগফল 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
এর পরিসরে-
A[i]
দ্বারা x হ্রাস করুন -
যখন x <0
-
x বাড়িয়ে A[j], j বাড়ান 1
-
-
ret :=ret + i – j + 1
-
-
রিটার্ন রিটার্ন
-
প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -
-
ret :=atMost(A, S) – atMost(A, S – 1)
-
রিটার্ন রিটার্ন
আরও ভাল বোঝার জন্য আসুন আমরা নিম্নলিখিত বাস্তবায়ন দেখি &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