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

C++での回転関数


整数Aの配列を指定し、nを配列Aの長さとします。ここで、Bkを、配列A、kの位置を時計回りに回転させて得られる配列と仮定します。ここで、回転は次のように定義できます-

  • F(k)=0 * Bk [0] + 1 * Bk [1] + ... +(n-1)*Bk[n-1]。

ここで、F(0)、F(1)、...、F(n-1)の最大値を見つけます。

したがって、入力がA =[4,3,2,6]の場合、-

  • F(0)=(0 * 4)+(1 * 3)+(2 * 2)+(3 * 6)=0 + 3 + 4 + 18 =25

  • F(1)=(0 * 6)+(1 * 4)+(2 * 3)+(3 * 2)=0 + 4 + 6 + 6 =16

  • F(2)=(0 * 2)+(1 * 6)+(2 * 4)+(3 * 3)=0 + 6 + 8 + 9 =23

  • F(3)=(0 * 3)+(1 * 2)+(2 * 6)+(3 * 4)=0 + 2 + 12 + 12 =26

最大は26です。

これを解決するには、次の手順に従います-

  • n:=配列Aのサイズ。nが0の場合、0を返します

  • ret:=0、サイズnの2つの配列を作成します。これらは右と左です

  • left [0]:=A [0]

  • 1からn–1の範囲のiの場合

    • left [i]:=left [i] + left [i – 1]

    • left [i]:=left [i] + A [i]

  • right [n – 1]:=A [n – 1]

  • n –1から0までの範囲のiの場合

    • right [i]:=right [i] + right [i + 1]

    • right [i]:=right [i] + A [i]

  • rightMul:=0、cnt:=n – 1

  • n –1から1までの範囲のiの場合

    • rightMul:=rightMul + A [i] * cnt

    • cntを1減らします

  • サイズnの配列xを作成します

  • 0からn–2の範囲のiの場合

    • x [i]:=rightMul

    • rightMul:=rightMul – right [i + 1]

  • leftMul:=0、cnt:=1

  • 0からn–2までの範囲のiの場合

    • leftMul:=leftMul + A [i] * cnt

    • cntを1増やします

  • cntを1減らします

  • n –1から1までの範囲のiの場合

    • x [i]:=x [i] + leftMul

    • leftMul:=leftMul – A [i – 1] * cnt

    • i – 2> =0の場合、leftMul:=leftMul + left [i – 2]

  • xの最大値を返す

例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
   public:
   int maxRotateFunction(vector<int>& A) {
      lli n = A.size();
      if(n == 0) return 0;
      lli ret = 0;
      vector <lli>right(n);
      vector <lli> left(n);
      left[0] = A[0];
      for(lli i = 1; i < n; i++){
         left[i] += left[i - 1];
         left[i] += A[i];
      }
      right[n - 1] = A[n - 1];
      for(lli i = n - 2; i >= 0; i--){
         right[i] += right[i + 1];
         right[i] += A[i];
      }
      lli rightMul = 0;
      lli cnt = n - 1;
      for(lli i = n - 1; i > 0; i--){
         rightMul += (A[i] * cnt);
         cnt--;
      }
      vector <lli> x(n);
      for(lli i = 0; i < n - 1; i++){
         x[i] = rightMul;
         rightMul -= right[i + 1];
      }
      lli leftMul = 0;
      cnt = 1;
      for(lli i = 0; i < n - 1; i++){
         leftMul += A[i] * cnt;
         cnt++;
      }
      cnt--;
      for(lli i = n - 1; i >= 1; i--){
         x[i] += leftMul;
         leftMul -= (A[i - 1] * cnt);
         if(i - 2 >= 0) leftMul += left[i - 2];
      }
      ret = INT_MIN;
      for(lli i = 0; i < x.size(); i++) ret = max(ret, x[i]);
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {4,3,2,6};
   cout <<(ob.maxRotateFunction(v));
}

入力

[4,3,2,6]

出力

26

  1. C ++のlog()関数

    C / C++ライブラリ関数doublelog(double x)は、xの自然対数(baseelogarithm)を返します。以下はlog()関数の宣言です。 double log(double x) パラメータは浮動小数点値です。そして、この関数はxの自然対数を返します。 例 #include <iostream> #include <cmath> using namespace std; int main () {    double x, ret;    x = 2.7;    /* finding l

  2. C ++のswap()関数

    swap()関数は、2つの数値を交換するために使用されます。この関数を使用すると、2つの数値を交換するために3番目の変数は必要ありません。 C ++言語でのswap()の構文は次のとおりです。 void swap(int variable_name1, int variable_name2); 変数に値を割り当てるか、ユーザー定義の値を渡すと、変数の値が交換されますが、変数の値は実際の場所では同じままです。 これがC++言語でのswap()の例です 例 #include <bits/stdc++.h> using namespace std; int main() { &nb