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

C++ में विभिन्न सूचियों से चुने गए तत्वों का न्यूनतम अंतर ढूंढने का प्रोग्राम

समस्या विवरण

मान लीजिए हमारे पास सूचियों की एक सूची है, हमें प्रत्येक सूची से एक मान चुनकर बनने वाले सबसे छोटे अंतर को ढूंढना है और चुने गए तत्वों के अधिकतम और न्यूनतम संख्या का अंतर लेना है।

उदाहरण के लिए, यदि इनपुट है lists = [[30, 50, 90], [85], [35, 70]], तो आउटपुट 20 होगा, क्योंकि हम 90, 85, 70 ले सकते हैं और 90 - 70 = 20 होगा।

हल करने का दृष्टिकोण

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

  1. maxVal := -अनंत
  2. ret := अनंत
  3. एक प्राथमिकता कतार pq परिभाषित करें
  4. n := सूचियों का आकार
  5. i := 0 से n-1 तक:
    • lists[i] को सॉर्ट करें
    • {lists[i][0], i, 0} को pq में डालें
    • maxVal := max(lists[i][0], maxVal)
  6. जब तक pq का आकार n के बराबर है:
    • temp := pq का शीर्ष तत्व
    • pq से शीर्ष तत्व हटाएं
    • ret := min(ret, maxVal - temp[0])
    • temp के अंतिम तत्व को बढ़ाएं
    • यदि temp का अंतिम तत्व < lists[temp[1]] का आकार:
      • maxVal := max(maxVal, lists[temp[1]][temp का अंतिम तत्व])
      • temp[0] := lists[temp[1]][temp का अंतिम तत्व]
      • temp को pq में डालें
  7. ret वापस करें

उदाहरण

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

struct Cmp {
    bool operator()(vector<int>& a, vector<int>& b) {
        return !(a[0] < b[0]);
    }
};

class Solution {
public:
    int solve(vector<vector<int>>& lists) {
        int maxVal = INT_MIN;
        int ret = INT_MAX;
        priority_queue<vector<int>, vector<vector<int>>, Cmp> pq;
        int n = lists.size();
        
        for (int i = 0; i < n; i++) {
            sort(lists[i].begin(), lists[i].end());
            pq.push({lists[i][0], i, 0});
            maxVal = max(lists[i][0], maxVal);
        }
        
        while (pq.size() == n) {
            vector<int> temp = pq.top();
            pq.pop();
            ret = min(ret, maxVal - temp[0]);
            temp.back()++;
            if (temp.back() < lists[temp[1]].size()) {
                maxVal = max(maxVal, lists[temp[1]][temp.back()]);
                temp[0] = lists[temp[1]][temp.back()];
                pq.push(temp);
            }
        }
        return ret;
    }
};

int solve(vector<vector<int>>& lists) {
    return (new Solution())->solve(lists);
}

int main() {
    vector<vector<int>> v = {{30, 50, 90}, {85}, {35, 70}};
    cout << solve(v);
}

इनपुट

{{30, 50, 90}, {85}, {35, 70}}

आउटपुट

20
  1. C++ में दिए गए वृत्त के दो भागों के कोणों का सबसे छोटा अंतर ढूंढना C++ में दिए गए वृत्त के दो भागों के कोणों का सबसे छोटा अंतर ढूंढना

    इस समस्या में, हमें एक ऐरे दिया गया है जो वृत्त के टुकड़ों को उनके कोणों के आधार पर दर्शाता है। हमारा कार्य C++ में दिए गए वृत्त के दो भागों के कोणों का सबसे छोटा अंतर ढूंढने के लिए एक प्रोग्राम बनाना है। समस्या विवरण हमें ऐरे में वृत्त के सभी टुकड़ों के कोण दिए गए हैं। हमें टुकड़ों को इस तरह जोड़न

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

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

  1. - पायथन में दो सूचियों से दो तत्वों के बीच न्यूनतम अंतर खोजने का प्रोग्राम

    मान लीजिए हमारे पास दो सूचियाँ L1 और L2 हैं, हमें L1 से एक संख्या और L2 से एक संख्या के बीच का सबसे छोटा अंतर ढूंढना है।इसलिए, यदि इनपुट L1 = [2, 7, 4], L2 = [16, 10, 11] जैसा है, तो आउटपुट 3 होगा, क्योंकि सबसे छोटा अंतर 10 - 7 = 3 है।इसे हल करने के लिए, हम इन चरणों का पालन करेंगे −सूची L1 और