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

C++で最高のスコアを持つ最小のローテーション


配列Aがあるとすると、配列がA [K]、A [K + 1]、A {K + 2]、... A [A.length-1]になるように、Kだけ回転させることができます。 A [0]、A [1]、...、A[K-1]。次に、インデックス以下のエントリは1ポイントの価値があります。

たとえば、配列[2、4、1、3、0]があり、K =2だけ回転すると、[1、3、0、2、4]になります。これは3ポイントの価値があります。1>0[ポイントなし]、3> 1 [ポイントなし]、0 <=2 [1ポイント獲得]、2 <=3 [1ポイント獲得]、4 <=4[ポイント獲得ワンポイント]。

Kを見つける必要があります。Kを見つけると、最高のスコアが得られます。複数の回答がある場合は、そのような最小のインデックスKを返します。したがって、入力がK =2の場合、回答は5になります。

したがって、入力が[2,3,1,5,1]の場合、出力は3になります。これは、-

が原因です。 配列 スコア
K
0 [2,3,1,5,1] 2
1 [3,1,5,1,2] 3
2 [1,5,1,2,4] 3
3 [5,1,2,4,1] 4
4 [1,2,4,1,3] 3

答えは3になります。

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

  • ret:=0
  • n:=Aのサイズ
  • サイズnの配列cntを定義します
  • iを初期化する場合:=0、i
  • A [i] <=iの場合、-
    • minI:=0、(cnt [minI]を1増やします)
    • maxI:=i --A [i]
    • maxI + 1
    • cnt[maxI+1減少1]
  • i + 1
  • cnt[i+1を1増やす
  • それ以外の場合
    • A [i]> =nの場合、-
      • 次の部分を無視し、次の反復にスキップします
    • minI:=i + 1
    • (cnt [minI]を1増やします)
    • maxi:=i +(n --A [i])
    • maxi + 1
    • cnt [maxi+1減少1]
  • maxCnt:=-1、temp:=0
  • iを初期化する場合:=0、i
  • temp:=temp + cnt [i]
  • temp> maxCntの場合、-
    • maxCnt:=temp
    • ret:=i
  • return ret
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       int bestRotation(vector<int>& A) {
          int ret = 0;
          int n = A.size();
          vector <int> cnt(n);
          for(int i = 0; i < n; i++){
             if(A[i] <= i){
                int minI = 0;
                cnt[minI]++;
                int maxI = i - A[i];
                if(maxI + 1 < n) cnt[maxI + 1]--;
                if(i + 1 < n) cnt[i + 1]++;
             }else{
                if(A[i] >= n) continue;
                int minI = i + 1;
                cnt[minI]++;
                int maxi = i + (n - A[i]);
                if(maxi + 1 < n)cnt[maxi + 1]--;
             }
          }
          int maxCnt = -1;
          int temp = 0;
          for(int i = 0; i < n; i++){
             temp += cnt[i];
             if(temp > maxCnt){
                maxCnt = temp;
                ret = i;
             }
          }
          return ret;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {2,3,1,5,1};
       cout << (ob.bestRotation(v));
    }

    入力

    [2,3,1,5,1]

    出力

    3

    1. C++で3nスライスのピザ

      さまざまなサイズの3nスライスのピザがあるとすると、私と2人の友人は次のようにピザのスライスを取ります- ピザのスライスを選びます。 友達のアマルが私のピックの反時計回りに次のスライスをピックします。 友達のBimalが、私のピックの時計回りに次のスライスをピックします。 ピザのスライスがなくなるまで、これらの手順を繰り返します。 ピザスライスのサイズは、時計回りの円形配列スライスで表されます。可能な最大のスライスサイズの合計を見つける必要があります。 したがって、入力が[9,8,6,1,1,8]のような場合、 次に、各ターンでサイズ8のピザスライスを選

    2. C++のすべての最も深いノードを持つ最小のサブツリー

      ルートをルートとする二分木があるとすると、各ノードの深さはルートまでの最短距離です。ここで、ノードは、ツリー全体のノードの中で可能な限り最大の深さを持っている場合に最も深くなります。ノードのサブツリーは、そのノードと、そのノードのすべての子孫のセットです。サブツリー内の最も深いノードがすべて含まれるように、最大​​の深さのノードを見つける必要があります。したがって、ツリーが次のような場合- その場合、最も深いサブツリーは-になります これを解決するには、次の手順に従います- ソルブ()と呼ばれるメソッドを定義します。これは入力としてルートになります ルートがnull