Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค่าสูงสุดของนิพจน์ค่าสัมบูรณ์ใน C++


สมมติว่าเรามีจำนวนเต็มสองอาร์เรย์ที่มีความยาวเท่ากัน เราต้องหาค่าสูงสุดของ:|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