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

C++ में सिंगल रिवर्सल के बाद अधिकतम आसन्न निरपेक्ष मान योग ढूंढने का प्रोग्राम


परिचय

मान लीजिए हमारे पास nums नामक संख्याओं की एक सूची है और हम सूची में किसी भी सबलिस्ट को अधिकतम एक बार रिवर्स कर सकते हैं। इस ऑपरेशन को करने के बाद, हमें निम्नलिखित का अधिकतम संभव मान ढूंढना है:

$\displaystyle\sum\limits_{i=0}^{n-2}| nums[i+1] - nums[i] |$

तो, यदि इनपुट nums = [2, 4, 6] है, तो आउटपुट 6 होगा, क्योंकि जब हम [4, 6] को रिवर्स करते हैं तो हमें सूची [2, 6, 4] मिलती है और मान |2 - 6| + |6 - 4| = 6 होता है।

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

यह एक उन्नत एल्गोरिदमिक समस्या है जिसमें हम प्रीफिक्स/सफिक्स अंतरों और चार स्थितियों (++, +-, -+, --) को ट्रैक करके इष्टतम रिवर्सल ढूंढते हैं।

उदाहरण कोड

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

int solve(vector<int>& nums) {
    if (nums.size() <= 1) return 0;
    int ans = 0;
    int n = nums.size();
    for (int i = 1; i < n; i++) {
        ans += abs(nums[i] - nums[i - 1]);
    }
    int orig = ans;
    for (int i = 1; i < n - 1; i++) {
        ans = max(ans, orig - abs(nums[i] - nums[i + 1]) + abs(nums[0] - nums[i + 1]));
        ans = max(ans, orig - abs(nums[i] - nums[i - 1]) + abs(nums[n - 1] - nums[i - 1]));
    }
    int pp = -abs(nums[1] - nums[0]) + nums[0] + nums[1];
    int pm = -abs(nums[1] - nums[0]) + nums[0] - nums[1];
    int mp = -abs(nums[1] - nums[0]) - nums[0] + nums[1];
    int mm = -abs(nums[1] - nums[0]) - nums[0] - nums[1];
    for (int j = 2; j < n - 1; j++) {
        int jerror = abs(nums[j + 1] - nums[j]);
        ans = max(ans, orig + pp - jerror - nums[j] - nums[j + 1]);
        ans = max(ans, orig + pm - jerror - nums[j] + nums[j + 1]);
        ans = max(ans, orig + mp - jerror + nums[j] - nums[j + 1]);
        ans = max(ans, orig + mm - jerror + nums[j] + nums[j + 1]);
        pp = max(pp, -abs(nums[j] - nums[j - 1]) + nums[j - 1] + nums[j]);
        pm = max(pm, -abs(nums[j] - nums[j - 1]) + nums[j - 1] - nums[j]);
        mp = max(mp, -abs(nums[j] - nums[j - 1]) - nums[j - 1] + nums[j]);
        mm = max(mm, -abs(nums[j] - nums[j - 1]) - nums[j - 1] - nums[j]);
    }
    return ans;
}

int main(){
    vector<int> v = {2, 4, 6};
    cout << solve(v);
    return 0;
}

इनपुट

{2, 4, 6}

आउटपुट

6

निष्कर्ष

यह O(n) एल्गोरिदम सभी संभावित रिवर्सल पर विचार करके अधिकतम आसन्न अंतर योग की गणना करता है। चार स्टेट वेरिएबल्स (pp, pm, mp, mm) चिह्न संयोजनों को ट्रैक करते हैं। यदि आपके कोई प्रश्न हैं, तो कमेंट सेक्शन में पूछें।


  1. C++ में बाइनरी ट्री में अधिकतम स्तर योग खोजें C++ में बाइनरी ट्री में अधिकतम स्तर योग खोजें

    इस समस्या में, हमें एक बाइनरी ट्री दिया गया है जिसमें सकारात्मक और नकारात्मक मान हैं। हमारा कार्य बाइनरी ट्री में अधिकतम स्तर योग खोजना है। समस्या विवरण: हमारे पास एक बाइनरी ट्री है, हम बाइनरी ट्री में सभी स्तरों का योग खोजेंगे और फिर उनमें से अधिकतम लौटाएंगे।एक उदाहरण लेकर समस्या को समझते

  1. C++ में उस नोड को ढूंढें जिसका X के साथ निरपेक्ष अंतर न्यूनतम मान देता है C++ में उस नोड को ढूंढें जिसका X के साथ निरपेक्ष अंतर न्यूनतम मान देता है

    मान लीजिए हमारे पास एक ट्री है, और सभी नोड्स के वजन और एक पूर्णांक x है। हमें नोड i ढूंढना है, जैसे कि |weight[i] - x| न्यूनतम हो। यदि ग्राफ नीचे की तरह है, और x = 15 आउटपुट 3 होगा। अब विभिन्न नोड्स के लिए, यह नीचे की तरह होगा: नोड 1, |5 – 15| = 10 नोड 2, |10 – 15| = 5 नोड 3, |11 – 15| = 4 नोड 4, |

  1. - पायथन में ऑपरेशन के बाद अधिकतम सबएरे का योग खोजने का प्रोग्राम

    मान लीजिए हमें इंटीजर नंबर्स वाला एक ऐरे दिया गया है। हम एक ऑपरेशन कर सकते हैं जहां हम array[i] के मान को उसके वर्ग मान से बदल सकते हैं; यानी array[i] * array[i]। केवल इस तरह का एक ऑपरेशन अनुमत है और हमें ऑपरेशन के बाद अधिकतम संभव सबएरे का योग वापस करना है। सबएरे खाली नहीं हो सकता। उदाहरण के लिए, य