ধরি nums নামক একটি ইন্টিজার অ্যারে দেওয়া আছে। এই অ্যারের ভ্যালু হলো সব i (0 থেকে n-2) এর জন্য |nums[i] - nums[i+1]| এর যোগফল। আমরা অ্যারের যেকোনো একটি সাবঅ্যারে বেছে নিয়ে সেটা রিভার্স করতে পারি। এই অপারেশন শুধু একবার করা যাবে। তারপর ফাইনাল অ্যারের সর্বোচ্চ সম্ভাব্য ভ্যালু বের করতে হবে।
ইনপুট যদি [1,5,4,2,3] হয়, তবে আউটপুট হবে 10।
সমাধানের ধাপসমূহ
ret := 0, extra := 0
n := nums এর আকার
minVal := inf, maxVal := -inf
i := 0 থেকে n-2 পর্যন্ত লুপ চালান –
a := nums[i], b := nums[i+1]
ret := ret + |b - a|
extra := max(extra, |nums[0] - b| - |a - b|)
extra := max(extra, |nums[n-1] - a| - |a - b|)
maxVal := max(maxVal, min(a, b))
minVal := min(minVal, max(a, b))
ret + max(extra, (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