मान लीजिए कि हमारे पास सकारात्मक पूर्णांकों की एक सरणी A है, तो हम A का एक अच्छा उप-सरणी (सन्निहित) कह सकते हैं, यदि उस उप-सरणी में विभिन्न पूर्णांकों की संख्या बिल्कुल K है। तो, यदि सरणी [1,2,3,1] की तरह है ,2] में 3 अलग-अलग पूर्णांक हैं:1, 2, और 3। हमें A के अच्छे सबअरे की संख्या ज्ञात करनी है।
इसलिए, यदि इनपुट [1,2,3,1,4] और K =3 जैसा है, तो आउटपुट 4 होगा, क्योंकि यह ठीक चार अलग-अलग पूर्णांकों के साथ तीन सबएरे बना सकता है, ये हैं [1,2,3 ], [1,2,3,1], [2,3,1], [3,1,4]।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
किसी फ़ंक्शन को atMost() पर परिभाषित करें, यह एक सरणी a और चर k लेगा,
-
एक सेट करेंट को परिभाषित करें
-
जे:=0, उत्तर:=0, एन:=एक का आकार
-
एक नक्शा परिभाषित करें मी
-
इनिशियलाइज़ i :=0 के लिए, जब i
-
अगर m[a[i]] शून्य है, तो m[a[i]] को 1 से बढ़ा दें -
-
जबकि k <0, करें -
-
यदि m[a[j]] को 1 से घटाएं और m[a[i]] शून्य है, तो -
-
(के द्वारा 1 बढ़ाएँ)
-
-
(जम्मू को 1 से बढ़ाएं)
-
-
-
x :=((i - j) + 1)
-
उत्तर:=उत्तर + x
-
-
वापसी उत्तर
-
मुख्य विधि से निम्न कार्य करें -
-
वापसी atMost(a, k) - atMost(a, k-1);
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; class Solution { public: int subarraysWithKDistinct(vector<int>& a, int k) { return atMost(a, k) - atMost(a, k - 1); } int atMost(vector <int>& a, int k){ set <int> current; int j = 0; int ans = 0; int n = a.size(); unordered_map <int, int> m; for(int i = 0; i < a.size(); i++){ if(!m[a[i]]++) k--; while(k < 0){ if(!--m[a[j]]) k++; j++; } int x = ((i - j) + 1); ans += x; } return ans; } }; main(){ Solution ob; vector<int> v = {1,2,3,1,4}; cout << (ob.subarraysWithKDistinct(v, 3)); }
इनपुट
{1,2,3,1,4}, 3
आउटपुट
4