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

C++ में निरपेक्ष अंतर से कम या सीमा के बराबर के साथ सबसे लंबा सतत सबरे

मान लीजिए कि हमारे पास पूर्णांकों की एक सरणी है जिसे अंक और एक पूर्णांक सीमा कहा जाता है, हमें सबसे लंबे गैर-रिक्त उप-सरणी का आकार इस प्रकार खोजना होगा कि इस उप-सरणी के किन्हीं दो मदों के बीच पूर्ण अंतर दी गई सीमा से कम या उसके बराबर हो।

इसलिए, यदि इनपुट संख्या =[8,2,4,7], सीमा =4 की तरह है, तो आउटपुट 2 होगा, ऐसा इसलिए है क्योंकि -

  • [8] तो |8-8| =0 <=4.

  • [8,2] तो |8-2| =6> 4.

  • [8,2,4] तो |8-2| =6> 4.

  • [8,2,4,7] तो |8-2| =6> 4.

  • [2] इसलिए |2-2| =0 <=4.

  • [2,4] तो |2-4| =2 <=4.

  • [2,4,7] तो |2-7| =5> 4.

  • [4] तो |4-4| =0 <=4.

  • [4,7] तो |4-7| =3 <=4.

  • [7] तो |7-7| =0 <=4.

अंत में, सबसे लंबे सबअरे का आकार 2 है।

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

  • रिट:=0, मैं:=0, जे:=0

  • एक डेक मैक्सडी और दूसरे डेक मिनडी को परिभाषित करें

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

  • इनिशियलाइज़ i:=0 के लिए, जब i

    • जबकि (maxD खाली नहीं है और maxD का अंतिम तत्व

      • maxD से अंतिम तत्व हटाएं

    • जबकि (minD खाली नहीं है और minD का अंतिम तत्व> nums[i]), करते हैं -

      • minD से अंतिम तत्व हटाएं

    • nums[i] maxD के अंत में डालें

    • minD के अंत में nums[i] डालें

    • जबकि (maxD का पहला तत्व - minD का पहला तत्व)> k, do -

      • अगर nums[j] maxD के पहले तत्व के समान है, तो−

        • मैक्सडी से फ्रंट एलिमेंट हटाएं

      • यदि nums[j] minD के पहले तत्व के समान है, तो -

        • minD से फ्रंट एलिमेंट हटाएं

      • (जम्मू को 1 से बढ़ाएं)

    • ret :=अधिकतम रिट और (i - j + 1)

  • वापसी रिट

उदाहरण

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int longestSubarray(vector<int>& nums, int k) {
      int ret = 0;
      int i = 0;
      int j = 0;
      deque<int> maxD;
      deque<int> minD;
      int n = nums.size();
      for (int i = 0; i < n; i++) {
         while (!maxD.empty() && maxD.back() < nums[i])
            maxD.pop_back();
         while (!minD.empty() && minD.back() > nums[i])
            minD.pop_back();
         maxD.push_back(nums[i]);
         minD.push_back(nums[i]);
         while (maxD.front() - minD.front() > k) {
            if (nums[j] == maxD.front())
               maxD.pop_front();
            if (nums[j] == minD.front())
               minD.pop_front();
            j++;
         }
         ret = max(ret, i - j + 1);
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {7,8,2,4};
   cout << (ob.longestSubarray(v, 4));
}

इनपुट

{7,8,2,4}, 4

आउटपुट

2

  1. C++ में Y से कम संख्या वाले सेटों की न्यूनतम संख्या

    समस्या कथन लगातार अंकों की एक स्ट्रिंग और एक संख्या Y को देखते हुए, कार्य न्यूनतम सेटों की संख्या ज्ञात करना है जैसे कि प्रत्येक सेट नीचे दिए गए नियम का पालन करता है - सेट में लगातार संख्याएं होनी चाहिए किसी भी अंक का एक से अधिक बार उपयोग नहीं किया जा सकता है। सेट में संख्या Y से अधिक नहीं होनी चा

  1. C++ में n से कम या उसके बराबर सभी भाज्य संख्याएँ ज्ञात कीजिए

    यहां हम देखेंगे कि n से कम या उसके बराबर सभी भाज्य संख्याओं को कैसे मुद्रित किया जाता है, एक संख्या N को भाज्य संख्या कहा जाता है यदि यह एक धनात्मक संख्या का भाज्य है। तो कुछ भाज्य संख्याएं 1, 2, 6, 24, 120 हैं। फैक्टोरियल नंबर प्रिंट करने के लिए, हमें सीधे फैक्टोरियल खोजने की जरूरत नहीं है। I =1 स

  1. सी ++ में उत्पाद के बराबर एलसीएम के साथ अधिकतम लंबाई उपसरणी

    मान लीजिए कि हमारे पास एक सरणी A है। हमें उप-सरणी की अधिकतम लंबाई ज्ञात करनी है, जिसका LCM उस उप-सरणी के तत्वों के गुणनफल के समान है। यदि उस प्रकार का उप-सरणी नहीं मिलता है, तो -1 लौटाएं। मान लीजिए सरणी {6, 10, 21} है, तो लंबाई 2 है, क्योंकि उप-सरणी {10, 21} है, जिसका एलसीएम 210 है, और उत्पाद भी 210