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

C++ में मैक्स चंक्स टू मेक सॉर्टेड II (Max Chunks To Make Sorted II)


समस्या विवरण

हमें एक पूर्णांक सरणी arr दी गई है। हमें सरणी को कुछ पार्टीशन (partitions) में विभाजित करना है, प्रत्येक पार्टीशन को व्यक्तिगत रूप से क्रमबद्ध (sort) करना है, और फिर उन्हें जोड़कर (concatenate) एक क्रमबद्ध सरणी प्राप्त करनी है। हमें अधिकतम संभव पार्टीशन की संख्या ज्ञात करनी है।

उदाहरण

इनपुट

[3,2,4,5,5]

आउटपुट

4

व्याख्या

हम पार्टीशन बना सकते हैं: [3,2], [4], [5], [5]। प्रत्येक को क्रमबद्ध करने पर: [2,3], [4], [5], [5]। जोड़ने पर: [2,3,4,5,5] जो क्रमबद्ध है।

समाधान दृष्टिकोण

प्रीफिक्स मैक्सिमम (prefix maximum) और सफिक्स मिनिमम (suffix minimum) सरणियों का उपयोग करें:

  1. maxOfLeft[i] = सूचकांक 0 से i तक का अधिकतम मान।
  2. minOfRight[i] = सूचकांक i से n-1 तक का न्यूनतम मान।
  3. यदि minOfRight[i+1] >= maxOfLeft[i], तो i के बाद पार्टीशन बना सकते हैं।
  4. ऐसे सभी वैध पार्टीशन बिंदुओं की गणना करें + 1 (अंतिम पार्टीशन के लिए)।

कार्यकारी प्रोग्राम

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    int maxChunksToSorted(vector<int>& arr) {
        int cnt = 1;
        int n = arr.size();
        vector<int> maxOfLeft(n);
        vector<int> minOfRight(n);
        
        maxOfLeft[0] = arr[0];
        for (int i = 1; i < n; i++)
            maxOfLeft[i] = max(maxOfLeft[i - 1], arr[i]);
        
        minOfRight[n - 1] = arr[n - 1];
        for (int i = n - 2; i >= 0; i--)
            minOfRight[i] = min(minOfRight[i + 1], arr[i]);
        
        for (int i = 0; i < n - 1; i++) {
            if (minOfRight[i + 1] >= maxOfLeft[i])
                cnt++;
        }
        return cnt;
    }
};

int main() {
    Solution ob;
    vector<int> v = {3,2,4,5,5};
    cout << ob.maxChunksToSorted(v);
    return 0;
}

आउटपुट

4
  1. C++ में एक रेखा पर अधिकतम बिंदु C++ में एक रेखा पर अधिकतम बिंदु

    मान लीजिए हमारे पास एक 2D तल है। हमें उन अधिकतम बिंदुओं की संख्या ढूंढनी है जो एक ही सीधी रेखा पर स्थित हैं। तो यदि बिंदु इस तरह हैं -तो 4 बिंदु हैंइसे हल करने के लिए, हम निम्नलिखित चरणों का पालन करेंगे -n := बिंदुओं की संख्या, यदि n < 3, तो n लौटाएंans := 2i को 1 से n - 1 तक की रेंज मेंcount := 0इं

  1. - C++ प्रोग्राम: सॉर्टेड ऐरे कार्यान्वयन (सिलेक्शन सॉर्ट)

    सॉर्टेड ऐरे ऐरे जिसमें तत्व क्रमबद्ध क्रम में हों (संख्यात्मक, वर्णानुक्रमिक, आदि)। कई सॉर्टिंग एल्गोरिदम: बबल सॉर्ट, इन्सर्शन सॉर्ट, सिलेक्शन सॉर्ट, मर्ज सॉर्ट, क्विक सॉर्ट, हीप सॉर्ट। सिलेक्शन सॉर्ट अनसॉर्टेड भाग में सबसे छोटा तत्व ढूंढकर उसे शुरुआत से स्वैप करता है। O(n²) समय जटिलता। C++ प्रोग

  1. - पायथन में सरणी को क्रमबद्ध करने के लिए अधिकतम खंड खोजने का प्रोग्राम

    मान लीजिए हमारे पास nums नामक एक सरणी है। हमें सरणी को कुछ विभाजनों में विभाजित करना है, और प्रत्येक को व्यक्तिगत रूप से क्रमबद्ध करना है। अब उन्हें जोड़ने के बाद हमें एक क्रमबद्ध सरणी मिलेगी। हमें अधिकतम विभाजनों की संख्या ज्ञात करनी है जो हम बना सकते हैं?उदाहरण के लिए, यदि इनपुट [3,2,4,5,5] है, तो