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

C++ में अधिकतम अंतराल


मान लीजिए हमारे पास एक सरणी है, जो क्रमबद्ध नहीं है। हमें इसके क्रमबद्ध रूप में क्रमिक तत्वों के बीच अधिकतम अंतर ढूंढना है। यदि सरणी में 2 से कम तत्व हैं तो हम 0 लौटाएंगे। तो यदि सरणी [12,3,9,1,17] जैसी है, तो आउटपुट 6 होगा, क्योंकि क्रमबद्ध सरणी [1,3,9,12,17] होगी तो 5 अधिकतम अंतर होगा क्योंकि 3 और 9 के बीच अंतर 6 है।

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

  • minVal := inf, maxCal := -inf

  • n := nums का आकार

  • यदि n < 2, तो 0 लौटाएं;

  • i को 0 से n - 1 तक की रेंज में -

    • minVal := nums[i] और minVal का न्यूनतम

    • maxVal := nums[i] और maxVal का अधिकतम

  • gap := maxVal - minVal / n - 1 की सीलिंग

  • आकार n - 1 की एक सरणी bucketMax बनाएं, और इसे -inf से भरें

  • आकार n - 1 की एक सरणी bucketMin बनाएं, और इसे inf से भरें

  • i को 0 से n - 1 तक की रेंज में -

    • x := nums[i]

    • यदि x = minVal या x = maxVal, तो अगला भाग छोड़ें, अगले पुनरावृत्ति के लिए जाएं

    • idx := (nums[i] - minVal) / gap.

    • bucketMax[idx] := bucketMax[idx] और nums[i] का अधिकतम

    • bucketMin[idx] := bucketMin[idx] और nums[i] का न्यूनतम

  • ret := 0

  • prev := minVal

  • i को 0 से n - 1 तक की रेंज में

    • यदि bucketMax[i] = -inf और bucketMin[i] = inf, तो अगला भाग छोड़ें, अगले पुनरावृत्ति के लिए जाएं

    • ret := ret और bucketMin[i] - prev का अधिकतम

    • prev := bucketMax[i]

  • ret, maxVal - prev का अधिकतम लौटाएं

उदाहरण

बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें -

#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution {    public:    int maximumGap(vector<int>& nums) {       lli minVal = INT_MAX;       lli maxVal = INT_MIN;       int n = nums.size();       if(n < 2) return 0;       for(int i = 0; i < n; i++){          minVal = min((lli)nums[i], minVal);          maxVal = max((lli)nums[i], maxVal);       }       int gap = ceil((double)(maxVal - minVal) / (double)(n - 1));       vector <int> bucketMax(n - 1, INT_MIN);       vector <int> bucketMin(n - 1, INT_MAX);       for(int i = 0; i < n; i++){          int x = nums[i];          if(x == minVal || x == maxVal) continue;          int idx = (nums[i] - minVal) / gap;          bucketMax[idx] = max(bucketMax[idx], nums[i]);          bucketMin[idx] = min(bucketMin[idx], nums[i]);       }       lli ret = 0;       lli prev = minVal;       for(int i = 0; i < n - 1; i++){          if(bucketMax[i] == INT_MIN && bucketMin[i] == INT_MAX) continue;          ret = max(ret, bucketMin[i] - prev);          prev = bucketMax[i];       }       return max(ret, maxVal - prev);    } }; main(){    Solution ob;    vector<int> v = {12,3,9,1,17};    cout << (ob.maximumGap(v)); }

इनपुट

[12,3,9,1,17]

आउटपुट

6

  1. - C++ में स्लाइडिंग विंडो अधिकतम

    मान लीजिए हमारे पास nums नामक एक सरणी है, आकार k की एक स्लाइडिंग विंडो है जो सरणी के बाएं से दाएं जा रही है। हम विंडो में केवल k संख्याएं देख सकते हैं। प्रत्येक बार स्लाइडिंग विंडो दाएं तरफ एक स्थान से चलती है। हमें अधिकतम स्लाइडिंग विंडो ढूंढनी है। तो यदि इनपुट [1,3,-1,-3,5,3,6,8] जैसा है और k 3 है

  1. - C++ में मैक्सिमम विड्थ रैम्प (Maximum Width Ramp)

    मान लीजिए हमारे पास पूर्णांकों का एक ऐरे A है, एक रैम्प (i, j) का एक टपल है जिसके लिए i < j और A[i] ≤ A[j]। ऐसे रैम्प की चौड़ाई j - i होती है। हमें A में रैम्प की अधिकतम चौड़ाई खोजनी है। यदि कोई नहीं है, तो 0 लौटाएं। उदाहरण के लिए, यदि इनपुट [6,0,8,2,1,5] है, तो आउटपुट 4 होगा। यहां अधिकतम चौड़ाई रै

  1. - C++ में चतुर्भुज का अधिकतम क्षेत्रफल

    समस्या कथन चतुर्भुज की चार भुजाएं a, b, c, d दी गई हैं, दी गई भुजाओं से बनने वाले चतुर्भुज का अधिकतम क्षेत्रफल ज्ञात करें। एल्गोरिदम हम इस समस्या को हल करने के लिए ब्रह्मगुप्त के सूत्र का उपयोग कर सकते हैं: √((s-a)(s-b)(s-c)(s-d)) उपरोक्त सूत्र में s अर्ध-परिमाप है। इसकी गणना निम्नानुसार की जाती ह