मान लीजिए कि हमारे पास पूर्णांक संख्याओं की एक सरणी है और एक पूर्णांक 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