C++で配列値を最大化するための逆サブアレイ
numsという整数配列が1つあるとします。この配列の値は、| nums [i] -nums [i +1]|の合計として定義されます。 0からn-1の範囲のすべてのiに対して。ここで、nは配列のサイズです。指定された配列の任意のサブ配列を選択して、それを逆にすることができます。この操作は1回しか実行できません。次に、最終的な配列の可能な最大値を見つける必要があります。
したがって、入力が[1,5,4,2,3]の場合、出力は10になります。
これを解決するには、次の手順に従います-
-
ret:=0、extra:=0
-
n:=numsのサイズ
-
minVal:=inf、maxVal:=-inf
-
初期化i:=0の場合、i
-
a:=nums [i]、b:=nums [i + 1]
-
ret:=ret + | b --a |
-
extra:=extraの最大値と|(nums [0] --b)-| a --b ||
-
extra:=extraの最大値と|(nums [n --1] --a)-| a --b ||
-
maxVal:=maxValの最大値とaおよびbの最小値
-
minVal:=最小のminValと最大のaとb
-
-
ret +エクストラの最大値と(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
-
C++STLのArray::crbegin()とarray ::crend()?
ここでは、C ++ STLの配列のcrbegin()関数とcrend()関数を確認します。 array ::crbegin()関数は、逆イテレータを取得するために使用されます。コンテナの最後の要素を指す定数逆イテレータを返します。この関数はパラメータを取りません。 array ::crend()関数はcrbegin()の逆です。これにより、逆イテレータの最後の要素を指しているイテレータが返されます。 より良いアイデアを得るために、いくつかのコード例を見てみましょう。 例 #include<iostream> #include<array> using namesp
-
C ++でSTLを使用する配列のすべての逆順列?
このセクションでは、C++でSTLを使用してすべての逆順列を生成する方法を説明します。 (1、2、3)のようないくつかの数の順列と逆順列は、以下のようになります- 順列 1, 2, 3 1, 3, 2 2, 1, 3 2, 3, 1 3, 1, 2 3, 2, 1 逆順列 3, 2, 1 3, 1, 2 2, 3, 1 2, 1, 3 1, 3, 2 1, 2, 3 previous_permutation()関数を使用して結果を取得します アルゴリズム getPermutation(arr、n) Begin sort arr rever