Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी ++ में बदसूरत संख्याओं के साथ उप-सरणी की अधिकतम लंबाई

समस्या कथन

एन तत्वों की एक सरणी गिरफ्तारी [] को देखते हुए (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



  1. सी++ में एक सरणी में अधिकतम जीसीडी के साथ जोड़ी खोजें

    मान लीजिए कि हमारे पास सकारात्मक पूर्णांकों की एक सरणी है। हमारा काम सरणी से पूर्णांकों की जोड़ी को खोजना है, जहां GCD मान अधिकतम है। मान लीजिए A ={1, 2, 3, 4, 5}, तो आउटपुट 2 है। जोड़ी (2, 4) में GCD 2 है, अन्य GCD मान 2 से कम हैं। इस समस्या को हल करने के लिए, हम प्रत्येक तत्व के भाजक की गिनती को

  1. सी ++ में उत्पाद के बराबर एलसीएम के साथ अधिकतम लंबाई उपसरणी

    मान लीजिए कि हमारे पास एक सरणी A है। हमें उप-सरणी की अधिकतम लंबाई ज्ञात करनी है, जिसका LCM उस उप-सरणी के तत्वों के गुणनफल के समान है। यदि उस प्रकार का उप-सरणी नहीं मिलता है, तो -1 लौटाएं। मान लीजिए सरणी {6, 10, 21} है, तो लंबाई 2 है, क्योंकि उप-सरणी {10, 21} है, जिसका एलसीएम 210 है, और उत्पाद भी 210

  1. C++ में जोड़े की अधिकतम लंबाई श्रृंखला

    जोड़े की एक श्रृंखला दी गई है। प्रत्येक जोड़ी में दो पूर्णांक होते हैं और पहला पूर्णांक हमेशा छोटा होता है, और दूसरा बड़ा होता है, वही नियम श्रृंखला निर्माण के लिए भी लागू किया जा सकता है। एक जोड़ी (x, y) को एक जोड़ी (p, q) के बाद जोड़ा जा सकता है, केवल अगर q