हमें एक सरणी दी गई है arr[] जिसमें पूर्णांक हैं। लक्ष्य गिरफ्तारी [] के सभी उप-सरणी को गिनना है जैसे कि प्रत्येक में अलग-अलग तत्वों की संख्या मूल सरणी में अलग-अलग तत्वों की संख्या के समान होती है। अगर मूल सरणी [1,1,2,3] है तो उप-सरणी [1,2,3] और [1,1,2,3] होंगी।
मूल सरणी में कुल विशिष्ट तत्व 3 हैं। दोनों उप-सरणी में कुल विशिष्ट तत्व भी 3 हैं
आइए उदाहरणों से समझते हैं।
इनपुट - एआर [] ={1,2,1,2,3,4,2};
आउटपुट − मूल सरणी के समान कुल विशिष्ट तत्वों वाले उप-सरणी की संख्या है − 6
स्पष्टीकरण - एआर में विशिष्ट तत्व [] 4 (1,2,3,4) हैं। अलग-अलग तत्वों की समान संख्या वाली उप-सरणी हैं:(बाएं से दाएं की गणना अलग-अलग)
[1,2,1,2,3,4], [2,1,2,3,4], [1,2,3,4], [1,2,3,4,2], [2,1,2,3,4,2], [1,2,1,2,3,4,2 ]
इनपुट - गिरफ्तार [] ={8,7,5,6,10};
आउटपुट − मूल सरणी के समान कुल विशिष्ट तत्वों वाले उपसरणियों की संख्या है − 1
स्पष्टीकरण - एआर में विशिष्ट तत्व [] 5 (5,6,7,8,10) हैं। अलग-अलग तत्वों की समान संख्या वाले उप-सरणी हैं:(बाएं से दाएं की गणना करें) [8,7,6,5,10]। केवल 1
नीचे दिए गए प्रोग्राम में इस्तेमाल किया गया तरीका इस प्रकार है
-
पूर्णांक संख्याओं का एक सरणी arr[] लें और एक सरणी के आकार की गणना करें।
-
फ़ंक्शन sub_ele_diff_one(int arr[], int size) सरणी लेता है और लगातार तत्वों के साथ उपसरणियों की गिनती देता है जो 1 से भिन्न होते हैं।
-
एक अस्थायी चर गणना और चर को दाएं और बाएं लें।
-
यादृच्छिक जोड़े बनाने के लिए unordered_map प्रकार का एक चर लें।
-
0 से एक सरणी के आकार तक के लिए लूप प्रारंभ करें और इसके अंदर unordered_map के अंदर arr[i] का मान सेट करें।
-
अब, एक unordered_map के आकार की गणना करें और unordered_map को साफ़ करें।
-
0 से एक सरणी के आकार तक के लिए लूप प्रारंभ करें।
-
लूप के अंदर, WHILE को दाएं <आकार और बाएं
. तक प्रारंभ करें -
um[arr[right]]
. का मान पहले से बढ़ाएं -
अब, जांचें कि क्या um[arr[right]] =1 है, तो पहले बाएं के मान को 1 से बढ़ा दें।
-
WHILE के बाहर, अधिकार के मान को 1 से पहले बढ़ा दें।
-
चेक करें IF बाएँ =एक unordered_map का आकार फिर गिनने के लिए सेट करें + आकार - दाएँ + 1
-
um[arr[i]] को 1 से घटाएं
-
IF um[arr[i]] =0 की जाँच करें और फिर बाईं ओर को 1
. से घटाएँ -
गिनती वापस करें
-
परिणाम प्रिंट करें।
उदाहरण
#include <bits/stdc++.h>
using namespace std;
int sub_distinct(int arr[], int size){
int count = 0, right = 0, left = 0;
unordered_map<int, int> um;
for (int i = 0; i < size; ++i){
um[arr[i]] = 1;
}
int um_size = um.size();
um.clear();
for(int i = 0; i < size; ++i){
while (right < size && left < um_size){
++um[arr[right]];
if (um[arr[right]] == 1){
++left;
}
++right;
}
if (left == um_size){
count = count + (size - right + 1);
}
--um[arr[i]];
if (um[arr[i]] == 0){
--left;
}
}
return count;
}
int main(){
int arr[] = {4, 3, 2, 5};
int size = sizeof(arr) / sizeof(arr[0]);
cout<<"Count of subarrays having total distinct elements same as original array are: "<<sub_distinct(arr, size);
return 0;
} आउटपुट
यदि हम उपरोक्त कोड चलाते हैं तो यह निम्न आउटपुट उत्पन्न करेगा -
Count of subarrays having total distinct elements same as original array are: 1