মনে করুন একটি পূর্ণসংখ্যার অ্যারে `nums` এবং একটি পূর্ণসংখ্যা `k` আছে। একটি সাবঅ্যারে "নাইস সাবঅ্যারে" বলা হয় যদি সেটিতে ঠিক `k`টি অড্ড নম্বর থাকে। আমাদের নাইস সাবঅ্যারেগুলোর সংখ্যা বের করতে হবে। যদি অ্যারে `[1,1,2,1,1]` হয় এবং `k = 3`, তবে আউটপুট হবে ২, কারণ সাবঅ্যারেগুলো হলো `[1,1,2,1]`, এবং `[1,2,1,1]`।
এটি সমাধান করতে আমরা নিচের ধাপগুলো অনুসরণ করব -
- `ans := 0`, `n := nums` অ্যারের আকার
- `left := 0` এবং `right := 0`, এবং `count := 0`
- `odd` নামক একটি অ্যারে সংজ্ঞায়িত করুন, এটিকে `nums`-এ উপস্থিত সব অড্ড ভ্যালু দিয়ে ফিল করুন
- যদি `odd` অ্যারের লেন্থ `>= k` হয়, তবে
- `i` = 0 এবং `j` = `k-1` থেকে `odd`-এর আকার - 1 পর্যন্ত, `i` এবং `j` বাড়ান
- `left := odd[i] + 1` যদি `i = 0`, অন্যথায় `odd[i] - odd[i-1]`
- `right := odd[j]` যদি `odd`-এর আকার - 1 = `j`, অন্যথায় `odd[j+1] - odd[j]`
- `ans := ans + left * right`
- `i` = 0 এবং `j` = `k-1` থেকে `odd`-এর আকার - 1 পর্যন্ত, `i` এবং `j` বাড়ান
- `ans` রিটার্ন করুন
উদাহরণ (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