C++中絕對值表示式的最大值


假設我們有兩個長度相等的整數陣列,我們需要找到以下表達式的最大值:|arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j|。其中最大值取自所有0 <= i, j < arr1.length。例如,如果給定的兩個陣列是[1,2,3,4]和[-1,4,5,6],則輸出為13。

為了解決這個問題,我們將遵循以下步驟:

  • 定義一個名為getVal的方法,該方法將接收陣列v作為引數。

  • maxVal := -∞, minVal := ∞

  • 對於i從0到v的大小

    • minVal := v[i]和minVal的最小值

    • maxVal := v[i]和maxVal的最大值

  • 返回maxVal – minVal

  • 在主方法中,執行以下操作:

  • 建立一個大小為4的陣列ret

  • n := arr1的大小

  • 對於i從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]

  • ans := -∞

  • 對於i從0到3

    • ans := ans和getVal(ret[i])的最大值

  • 返回ans

讓我們來看下面的實現,以便更好地理解:

示例

線上演示

#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

更新於:2020年4月30日

637 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.