สมมติว่าเรามีจำนวนเต็มสองอาร์เรย์ที่มีความยาวเท่ากัน เราต้องหาค่าสูงสุดของ:|arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j|. โดยที่ค่าสูงสุดจะถูกนำไปทับ 0 <=i, j
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดวิธีการที่เรียกว่า getVal ซึ่งจะรับอาร์เรย์ v
-
maxVal :=-inf, minVal :=inf
-
สำหรับผมอยู่ในช่วง 0 ถึงขนาดของ v
-
minVal :=นาทีของ v[i] และ minVal
-
maxVal :=สูงสุดของ v[i] และ maxVal
-
-
คืนค่า maxVal – minVal
-
จากวิธีหลัก ให้ทำดังนี้
-
สร้างอาร์เรย์ ret ขนาด 4
-
n :=ขนาดของ arr1
-
สำหรับฉันอยู่ในช่วง 0 ถึง n – 1
-
ใส่ arr1[i] – arr2[i] + i ลงใน ret[0]
-
ใส่ arr1[i] + arr2[i] + i ลงใน ret[1]
-
ใส่ arr1[i] – arr2[i] - i เข้าไปใน ret[2]
-
ใส่ arr1[i] + arr2[i] - i เข้าไปใน ret[3]
-
-
ตอบ :=-inf
-
สำหรับผมอยู่ในช่วง 0 ถึง 3
-
ans :=สูงสุดของ ans และ getVal(ret[i])
-
-
กลับมาอีกครั้ง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: int getVal(vector <int>& v){ int maxVal = INT_MIN; int minVal = INT_MAX; for(int i = 0; i < v.size(); i++){ minVal = min(v[i], minVal); maxVal = max(v[i], maxVal); } return maxVal - minVal; } int maxAbsValExpr(vector<int>& arr1, vector<int>& arr2) { vector <int> ret[4]; int n = arr1.size(); for(int i = 0; i < n; i++){ ret[0].push_back(arr1[i] - arr2[i] + i); ret[1].push_back(arr1[i] + arr2[i] + i); ret[2].push_back(arr1[i] - arr2[i] - i); ret[3].push_back(arr1[i] + arr2[i] - i); } int ans = INT_MIN; for(int i = 0; i < 4; i++){ ans = max(ans, getVal(ret[i])); } return ans; } }; main(){ vector<int> v1 = {1,2,3,4}, v2 = {-1, 4, 5, 6}; Solution ob; cout << (ob.maxAbsValExpr(v1, v2)); }
อินพุต
[1,2,3,4] [-1,4,5,6]
ผลลัพธ์
13