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

C++ में लॉन्गेस्ट टर्ब्युलेंट सबएरे (Longest Turbulent Subarray)


एक उपसरणी A[i], A[i+1], ..., A[j] को टर्ब्युलेंट (turbulent) कहा जाता है जब यह इन शर्तों को पूरा करती है:

  • i ≤ k < j के लिए, जब k विषम हो तो A[k] > A[k+1], और जब k सम हो तो A[k] < A[k+1];

  • अन्यथा, i ≤ k < j के लिए, जब k सम हो तो A[k] > A[k+1], और जब k विषम हो तो A[k] < A[k+1]।

इसलिए उपसरणी टर्ब्युलेंट होती है यदि उपसरणी में प्रत्येक आसन्न जोड़ी के बीच तुलना चिन्ह बदलता रहता है। अब A के अधिकतम आकार की टर्ब्युलेंट उपसरणी की लंबाई खोजें।

उदाहरण के लिए, यदि इनपुट [9,4,2,10,7,8,8,1,9] है, तो आउटपुट 5 होगा। क्योंकि A[1] > A[2] < A[3] > A[4] < A[5]।

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

  1. n := A का आकार, prevBig := 1, prevSmall := 1, currBig := 1, currSmall := 1, ret := 1

  2. i को 1 से n-1 तक लूप चलाएं

  3. यदि A[i] > A[i-1] तो currBig := 1 + prevSmall

  4. यदि A[i] < A[i-1] तो currSmall := 1 + prevBig

  5. ret := max(ret, currBig, currSmall) अपडेट करें

  6. prevSmall := currSmall, prevBig := currBig, currSmall := 1, currBig := 1 रीसेट करें

  7. ret लौटाएं

C++ कार्यान्वयन

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

class Solution { 
public: 
    int maxTurbulenceSize(vector<int>& A) { 
        int n = A.size(); 
        int prevBig = 1; 
        int prevSmall = 1; 
        int currBig = 1; 
        int currSmall = 1; 
        int ret = 1; 
        for(int i = 1; i < n; i++){ 
            if(A[i] > A[i - 1]){ 
                currBig = 1 + prevSmall; 
            } 
            if(A[i] < A[i - 1]){ 
                currSmall = 1 + prevBig; 
            } 
            ret = max({ret, currBig, currSmall}); 
            prevSmall = currSmall; 
            prevBig = currBig; 
            currSmall = 1; 
            currBig = 1; 
        } 
        return ret; 
    } 
}; 

int main(){ 
    vector<int> v1 = {9,4,2,10,7,8,8,1,9}; 
    Solution ob; 
    cout << (ob.maxTurbulenceSize(v1)); 
    return 0; 
}

इनपुट

[9,4,2,10,7,8,8,1,9]

आउटपुट

5
  1. - C++ में लॉन्गेस्ट अंकगणितीय अनुक्रम (Longest Arithmetic Sequence)

    मान लीजिए हमारे पास पूर्णांकों का एक ऐरे A है, हमें A में सबसे लंबे अंकगणितीय उपअनुक्रम (arithmetic subsequence) की लंबाई लौटानी है। जैसा कि आप जानते हैं, A का एक उपअनुक्रम A[i_1], A[i_2], ..., A[i_k] की सूची है जहां 0 ≤ i_1 < i_2 < ... < i_k ≤ A.length - 1, और एक अनुक्रम B अंकगणितीय होता है जब B[i

  1. - C++ में सबएरे के XOR क्वेरीज़

    मान लीजिए हमारे पास पॉजिटिव इंटीजर्स का एक ऐरे arr है और क्वेरीज़ का एक ऐरे है जहां queries[i] = [Li, Ri], प्रत्येक क्वेरी i के लिए Li से Ri तक के एलिमेंट्स का XOR कंप्यूट करें (यानी, arr[Li] XOR arr[Li+1] xor ... xor arr[Ri])। हमें दिए गए क्वेरीज़ के परिणाम वाला ऐरे ढूंढना है। यदि इनपुट इस प्रकार ह

  1. - C++ में सबएरे मिनिमम का योग

    मान लीजिए हमारे पास इंटीजर्स का एक ऐरे A है। हमें min(B) का योग ढूंढना है, जहां B, A के हर (सन्निहित) सबएरे पर रेंज करता है। चूंकि उत्तर बहुत बड़ा हो सकता है, इसलिए उत्तर को मॉड्यूलो 10^9 + 7 में लौटाएं। यदि इनपुट [3,1,2,4] है, तो आउटपुट 17 होगा, क्योंकि सबएरे हैं [3], [1], [2], [4], [3,1], [1,2], [