मान लीजिए कि हमारे पास एक पूर्णांक सरणी है जिसे अंक कहते हैं। इस सरणी का मान |nums[i]-nums[i+1]| . के योग के रूप में परिभाषित किया गया है सभी के लिए मैं 0 से n - 1 की सीमा में हूं। जहां n सरणी का आकार है। हम दिए गए सरणी के किसी भी उप-सरणी का चयन कर सकते हैं और इसे उलट सकते हैं। हम इस ऑपरेशन को केवल एक बार ही कर सकते हैं। फिर हमें अंतिम सरणी का अधिकतम संभव मान ज्ञात करना होगा।
इसलिए, अगर इनपुट [1,5,4,2,3] जैसा है, तो आउटपुट 10 होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
रिट :=0, अतिरिक्त :=0
-
n :=अंकों का आकार
-
minVal :=inf, maxVal :=-inf
-
इनिशियलाइज़ i :=0 के लिए, जब i
-
ए:=अंक [i], बी:=अंक [i + 1]
-
रिट:=रिट + |बी - ए|
-
अतिरिक्त :=अधिकतम अतिरिक्त और |(nums[0] - b) - |a - b||
-
अतिरिक्त :=अधिकतम अतिरिक्त और |(nums[n - 1] - a) - |a - b||
-
maxVal :=अधिकतम अधिकतम वैल और न्यूनतम a और b
-
minVal :=न्यूनतम minVal और अधिकतम a और b
-
-
रिटर्न रिट + अधिकतम अतिरिक्त और (maxVal - minVal) * 2
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; class Solution { public: int maxValueAfterReverse(vector<int>& nums) { int ret = 0; int extra = 0; int n = nums.size(); int minVal = INT_MAX; int maxVal = INT_MIN; for(int i = 0; i < n - 1; i++){ int a = nums[i]; int b = nums[i + 1]; ret += abs(b - a); extra = max(extra, abs(nums[0] - b) - abs(a - b)); extra = max(extra, abs(nums[n - 1] - a) - abs(a - b)); maxVal = max(maxVal, min(a, b)); minVal = min(minVal, max(a, b)); } return ret + max(extra, (maxVal - minVal) * 2); } }; main(){ Solution ob; vector<int> v = {1,5,4,2,3}; cout << (ob.maxValueAfterReverse(v)); }
इनपुट
{1,5,4,2,3}
आउटपुट
10