C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

| arr [i] – arr [j]-+ | i –j|の最大値C++で


この問題では、n個の整数の配列が与えられます。私たちのタスクは、| arr [i] -arr[j]|の最大値を見つけるプログラムを作成することです。 + |i-j|。

問題を理解するために例を見てみましょう

入力 −配列={4、1、2}

出力 − 4

説明

|arr[0] - arr[1]|+|0-1| = |4-1| + |-1| = 3+1 = 4
|arr[0] - arr[2]|+|0-2| = |4-2| + |-2| = 2+2 = 4
|arr[1] - arr[2 ]|+|1-2| = |1-2| + |1-2| = 1+1 = 2

この問題を解決するための簡単なアプローチは、ブルートフォースを使用することです。 2つのループを使用し、最大の差を見つけるアプローチ。

ただし、効率的なアプローチは、絶対関数のプロパティを使用することです。

方程式をデコードして解を見つけましょう

arr[i] - arr[j] + i - j = (arr[i] + i) - (arr[j] + j)
arr[i] - arr[j] - i + j = (arr[i] - i) - (arr[j] - j)
-arr[i] + arr[j] + i - j = -{(arr[i]-i) -(arr[j]-j)}
-arr[i] + arr[j] - i + j = -{(arr[i]+i) - (arr[j]+j)}

1番目と4番目は同じで、2番目と4番目は同じです。これを使用して、値arr[i]+-iを格納する2つの配列を作成します。

array1は、値arr [i] + i

を格納します

array2は値を格納しますarr[i]-i

したがって、最大2つの値が見つかります

max((max(array1)-min(array1))、(max(array2)-min(array2)))

ソリューションの実装を示すプログラム

#include<iostream>
using namespace std;
int maxDiff(int arr[], int n) {
   int ans = 0;
   for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
         ans = max(ans, abs(arr[i] - arr[j]) + abs(i - j));
   return ans;
}
int main() {
   int array[] = { 5, 7, 1, 2 };
   int n = sizeof(array) / sizeof(array[0]);
   cout<<"The maximum value of |arr[i] - arr[j]| + |i-j| is "<<maxDiff(array, n);
   return 0;
}

出力

The maximum value of |arr[i] - arr[j]| + |i-j| is 7

  1. C ++のexpm1()

    関数expm1()は、任意の数から1を引いた累乗の指数を計算するために使用されます。 (指数をaの累乗で累乗した)-1の値を返します。 expm1()の数式は次のとおりです。 expm1(a) = (e^a) - 1 C ++言語でのexpm1()の構文は次のとおりです。 float expm1(variable_name); ここで 変数名 −値が計算される変数に付けられた任意の名前。 これは、C ++言語でのexpm1()の例です。 例 #include <iostream> #include <cmath> using namespace std

  2. C ++のlog1p()

    関数log1p()は、(a + 1)の自然対数(基数e対数)を計算するために使用されます。ここで、aは任意の数値です。 (a + 1)の自然対数の値を返します。 -1未満の値を渡すと、Not a number(Nan)が返されます。 log1p()の数式は次のとおりです。 log1p(a) = base-e log(a+1) C ++言語でのlog1p()の構文は次のとおりです。 float log1p(float variable_name); ここで variable_name −対数値が計算される変数に付けられた名前。 これは、C ++言語でのlog1p()の例です