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

C++ में बदसूरत संख्याओं वाले सब-ऐरे की अधिकतम लंबाई


समस्या कथन

N तत्वों का एक ऐरे arr[] दिया गया है (0 ≤ arr[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 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. - C++ में सरणी में अधिकतम GCD वाली जोड़ी ढूंढना

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

  1. - C++ में LCM उत्पाद के बराबर होने वाले अधिकतम लंबाई के सबएरे

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

  1. - C++ में पेयर्स की अधिकतम लंबाई चेन

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