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

C++ में दो सॉर्टेड लिस्ट का मेडियन ढूंढने वाला प्रोग्राम


मान लीजिए हमारे पास दो सॉर्टेड लिस्ट हैं। हमें इन दो लिस्ट का मेडियन ढूंढना है। इसलिए यदि सरणियाँ [1,5,8] और [2,3,6,9] जैसी हैं, तो उत्तर 5 होगा।

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

इसे हल करने के लिए, हम निम्न चरणों का पालन करेंगे:

  1. एक फंक्शन solve() परिभाषित करें, यह एक सरणी nums1, एक सरणी nums2 लेगा।
  2. यदि nums1 का आकार > nums2 का आकार, तो:
    • solve(nums2, nums1) लौटाएँ
  3. x := nums1 का आकार, y := nums2 का आकार
  4. low := 0, high := x
  5. totalLength := x + y
  6. जब low <= high, करें:
    • partitionX := low + (high - low) / 2
    • partitionY := (totalLength + 1) / 2 - partitionX
    • maxLeftX := (यदि partitionX 0 के समान है, तो -inf, अन्यथा nums1[partitionX - 1])
    • minRightX := (यदि partitionX x के समान है, तो inf, अन्यथा nums1[partitionX])
    • maxLeftY := (यदि partitionY 0 के समान है, तो -inf, अन्यथा nums2[partitionY - 1])
    • minRightY := (यदि partitionY y के समान है, तो inf, अन्यथा nums2[partitionY])
    • यदि maxLeftX <= minRightY और maxLeftY <= minRightX, तो:
      • यदि totalLength mod 2 0 के समान है, तो:
        • ((maxLeftX और maxLeftY का अधिकतम) + (minRightX और minRightY का न्यूनतम)) / 2 लौटाएँ
      • अन्यथा
        • maxLeftX और maxLeftY का अधिकतम लौटाएँ
    • अन्यथा जब maxLeftX > minRightY, तो:
      • high := partitionX - 1
    • अन्यथा low = partitionX + 1
  7. 0 लौटाएँ

उदाहरण

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

class Solution {
public:
    double solve(vector<int>& nums1, vector<int>& nums2) {
        if (nums1.size() > nums2.size())
            return solve(nums2, nums1);
        int x = nums1.size();
        int y = nums2.size();
        int low = 0;
        int high = x;
        int totalLength = x + y;
        while (low <= high) {
            int partitionX = low + (high - low) / 2;
            int partitionY = (totalLength + 1) / 2 - partitionX;
            int maxLeftX = (partitionX == 0 ? INT_MIN : nums1[partitionX - 1]);
            int minRightX = (partitionX == x ? INT_MAX : nums1[partitionX]);
            int maxLeftY = (partitionY == 0 ? INT_MIN : nums2[partitionY - 1]);
            int minRightY = (partitionY == y ? INT_MAX : nums2[partitionY]);
            if (maxLeftX <= minRightY && maxLeftY <= minRightX) {
                if (totalLength % 2 == 0) {
                    return ((double)max(maxLeftX, maxLeftY) + (double)min(minRightX, minRightY)) / 2;
                } else {
                    return max(maxLeftX, maxLeftY);
                }
            } else if (maxLeftX > minRightY)
                high = partitionX - 1;
            else
                low = partitionX + 1;
        }
        return 0;
    }
};

int main() {
    Solution ob;
    vector<int> v1 = {1, 5, 8}, v2 = {2, 3, 6, 9};
    cout << (ob.solve(v1, v2));
    return 0;
}

इनपुट

[1,5,8], [2,3,6,9]

आउटपुट

5
  1. - C++ प्रोग्राम: मीडियन के निकटतम k नंबर खोजना

    यह C++ प्रोग्राम एक सेट S (n नंबर्स) के मीडियन (Median) के निकटतम k नंबर खोजता है। यह क्विकसॉर्ट द्वारा सॉर्टिंग के बाद मीडियन के दोनों ओर से निकटतम तत्व चुनता है। एल्गोरिदम शुरुआत 1. फंक्शन Partition() - हाई पर पिवट के आधार पर ऐरे पार्टीशन करें 2. फंक्शन QuickSort() - क्विकसॉर्ट एल्गोरिदम से

  1. - C++ प्रोग्राम: ग्राफ में दो नोड्स के बीच पाथ खोजें

    इस प्रोग्राम में हम दिए गए ग्राफ पर DFS का उपयोग करके दो नोड्स के बीच पाथ मौजूद है या नहीं पता लगा सकते हैं। एल्गोरिदम Begin    function isReach() एक रिकर्सिव फंक्शन है जो जांचता है कि d, s से पहुंच योग्य है या नहीं:    A) सभी वर्टेक्स को अनविज़िटेड मार्क करें।    B) व

  1. - C++ प्रोग्राम: बाइनरी सर्च दृष्टिकोण से दो सॉर्टेड एरे की माध्यिका खोजें

    एल्गोरिदम m2 तो संयुक्त माध्यिका या तो पहले एरे के पहले आधे में या दूसरे एरे के दूसरे आधे में होगी। यदि m1 < m2 तो संयुक्त माध्यिका या तो पहले एरे के दूसरे आधे में या दूसरे एरे के पहले आधे में होगी। अद्यतन प्रारंभ और अंत इंडेक्स के साथ median() को पुनरावर्ती रूप से कॉल करें।उदाहरण कोड#include <io