समस्या कथन
एन तत्वों की एक सरणी गिरफ्तारी [] को देखते हुए (0 ≤ गिरफ्तारी [i] 1000)। कार्य उप-सरणी की अधिकतम लंबाई को खोजना है जिसमें केवल बदसूरत संख्याएं हैं।
बदसूरत संख्याएँ वे संख्याएँ होती हैं जिनके केवल अभाज्य गुणनखंड 2, 3 या 5 होते हैं।
उदाहरण के लिए नीचे श्रृंखला से कुछ संख्याएँ हैं:1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15,…
उदाहरण
यदि इनपुट ऐरे {1, 2, 7, 9, 120, 810, 374} है तो उत्तर 3 है -
बदसूरत संख्या सिस की सबसे लंबी संभव उप-सरणी {9, 120, 810}
एल्गोरिदम
- एक unordered_set लें, और सभी बदसूरत नंबर डालें जो सेट में 1000 से कम हों
- सरणी को दो चरनामों current_max और max_so_far के साथ पार करें।
- जांचें कि प्रत्येक तत्व सेट में मौजूद है या नहीं
- यदि कोई बदसूरत संख्या मिलती है, तो current_max बढ़ाएँ और उसकी तुलना max_so_far से करें
- यदि current_max> max_so_far तो max_so_far =current_max।
- हर बार एक गैर-बदसूरत तत्व मिलने पर, current_max =0 रीसेट करें।
उदाहरण
#include <bits/stdc++.h>
using namespace std;
unsigned getUglyNumbers(int n) {
int ugly[n];
int i2 = 0, i3 = 0, i5 = 0;
int next_multiple_of_2 = 2;
int next_multiple_of_3 = 3;
int next_multiple_of_5 = 5;
int next_ugly_no = 1;
ugly[0] = 1;
for (int i = 1; i < n; i++) {
next_ugly_no = min(next_multiple_of_2, min(next_multiple_of_3, next_multiple_of_5));
ugly[i] = next_ugly_no;
if (next_ugly_no == next_multiple_of_2) {
i2 = i2 + 1;
next_multiple_of_2 = ugly[i2] * 2;
}
if (next_ugly_no == next_multiple_of_3) {
i3 = i3 + 1;
next_multiple_of_3 = ugly[i3] * 3;
}
if (next_ugly_no == next_multiple_of_5) {
i5 = i5 + 1;
next_multiple_of_5 = ugly[i5] * 5;
}
}
return next_ugly_no;
}
int maxUglySubarray(int arr[], int n) {
unordered_set<int> s;
int i = 1;
while (1) {
int next_ugly_number = getUglyNumbers(i);
if (next_ugly_number > 1000)
break;
s.insert(next_ugly_number);
i++;
}
int current_max = 0, max_so_far = 0;
for (int i = 0; i < n; i++) {
if (s.find(arr[i]) == s.end())
current_max = 0;
else {
current_max++;
max_so_far = max(current_max,
max_so_far);
}
}
return max_so_far;
}
int main() {
int arr[] = {1, 2, 7, 9, 120, 810, 374};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "Maximum sub-array size of consecutive ugly numbers = " << maxUglySubarray(arr, n) << endl;
return 0;
} आउटपुट
जब आप उपरोक्त प्रोग्राम को संकलित और निष्पादित करते हैं। यह निम्नलिखित आउटपुट उत्पन्न करता है -
Maximum sub-array size of consecutive ugly numbers = 3