मान लीजिए हमारे पास इंटीजर्स का एक ऐरे nums और एक इंटीजर k है। एक सबएरे को नाइस सबएरे के रूप में जाना जाता है यदि उसमें k ऑड नंबर हैं। हमें नाइस सब-एरे की संख्या ढूंढनी है। यदि ऐरे [1,1,2,1,1] है, और k = 3, तो आउटपुट 2 होगा, क्योंकि सबएरे [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 को 1 से बढ़ाएं
- 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 को 1 से बढ़ाएं
- 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