ধরুন আমাদের কাছে পূর্ণসংখ্যার সংখ্যা এবং একটি পূর্ণসংখ্যা k আছে। একটি সাবয়ারেকে চমৎকার সাবয়ারে বলা হয় যদি তাতে k বিজোড় সংখ্যা থাকে। আমাদের চমৎকার সাব-অ্যারের সংখ্যা খুঁজে বের করতে হবে। সুতরাং যদি অ্যারে হয় [1,1,2,1,1], এবং k =3, তাহলে আউটপুট হবে 2, যেমন সাবয়ারে [1,1,2,1], এবং [1,2,1 ,1]
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- উত্তর :=0, n :=সংখ্যা অ্যারের আকার
- বাম :=0 এবং ডানে :=0, এবং গণনা :=0
- একটি অ্যারে বিজোড় সংজ্ঞায়িত করুন, সংখ্যায় উপস্থিত সমস্ত বিজোড় মান দিয়ে এটি পূরণ করুন
- যদি বিজোড় অ্যারের দৈর্ঘ্য হয়>=k, তাহলে
- এর জন্য i হল 0 এবং j রেঞ্জ k – 1 থেকে বিজোড় – 1 এর আকার, i এবং j 1 দ্বারা বাড়ান
- বাম:=বিজোড়[i] + 1 যদি i =0, অন্যথায় বিজোড়[i] – বিজোড়[i – 1]
- ডান:=বিজোড়[j] যদি বিজোড়ের আকার – 1 =j, অন্যথায় বিজোড়[j + 1] – বিজোড়[j]
- উত্তর :=উত্তর + বাম * ডান
- এর জন্য i হল 0 এবং j রেঞ্জ k – 1 থেকে বিজোড় – 1 এর আকার, i এবং j 1 দ্বারা বাড়ান
- উত্তর ফেরত দিন
উদাহরণ(C++)
আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -
#include <bits/stdc++.h> using namespace std; class Solution { public: int numberOfSubarrays(vector<int>& nums, int k) { int ans = 0; int n = nums.size(); int left = 0; int right = 0; int cnt = 0; vector <int> odd; for(int i = 0; i < n; i++){ if(nums[i] % 2 == 1)odd.push_back(i); } if(odd.size()>=k){ for(int i = 0, j = k-1; j < odd.size(); i++, j++){ int left = i==0?odd[i]+1: odd[i] - odd[i-1]; int right = j==odd.size()-1 ?n-odd[j] : odd[j+1] - odd[j]; ans += left * right; } } return ans; } }; main(){ vector<int> v = {1,1,2,1,1}; Solution ob; cout <<ob.numberOfSubarrays(v, 3); }
ইনপুট
[1,1,2,1,1] 3
আউটপুট
2