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

सी++ में अधिकतम गैप

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

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

  • minVal :=inf, maxCal :=-inf

  • n :=अंकों का आकार

  • अगर n <2, तो 0 लौटाएं;

  • मैं के लिए 0 से n - 1 की सीमा में -

    • minVal :=min of nums[i] and minVal

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

  • गैप:=मैक्सवेल की सीलिंग - मिनवैल / एन - 1

  • बकेटमैक्स नामक एक सरणी बनाएं जिसका आकार n-1 है, और इसे -inf से भरें

  • बकेटमिन नामक एक सरणी बनाएं जिसका आकार n-1 है, और इसे inf से भरें

  • मैं के लिए 0 से n - 1 की सीमा में -

    • एक्स:=अंक [i]

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

    • idx :=(अंक [i] - minVal) / गैप।

    • बकेटमैक्स[idx] :=अधिकतम बकेटमैक्स[idx] और अंक[i]

    • बकेटमिन [idx] :=बकेटमिन का न्यूनतम [idx] और अंक [i]

  • रिट:=0

  • पिछला :=minVal

  • मेरे लिए 0 से n - 1 की सीमा में

    • अगर बकेटमैक्स [i] =-inf और बकेटमिन [i] =inf, तो अगला भाग छोड़ें, अगले पुनरावृत्ति के लिए जाएं

    • रिट :=अधिकतम रिट और बकेटमिन [i] - पिछला

    • पिछला :=बकेटमैक्स[i]

  • रिट का अधिकतम रिटर्न, मैक्सवैल - पिछला

उदाहरण

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

#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++ में

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

  1. सी ++ में अधिकतम चौड़ाई रैंप

    मान लीजिए कि हमारे पास पूर्णांकों की एक सरणी A है, एक रैंप एक टपल (i, j) है जिसके लिए i

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

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