C ++中具有最高分数的最小旋转

假设我们有一个数组A,我们可以将它旋转一个K,以便数组变成A [K],A [K + 1],A {K + 2],... A [A.length-1], A [0],A [1],...,A [K-1]。然后,任何小于或等于其索引的条目将获得1分。

因此,例如,让我们有一个数组[2,4,1,1,3,0],然后旋转K = 2,它变成[1、3、0、2、4]。这是值得的3分,因为1> 0 [没有获得收益],3> 1 [没有获得收益],0 <= 2 [获得1收益],2 <= 3 [获得1收益],4 <= 4 [获得4收益一点]。

我们必须找到K,为此,我们将获得最高分。如果有多个答案,则返回最小的索引K。因此,如果输入像K = 2,则答案将为5。

因此,如果输入类似于[2,3,1,5,1],则输出将为3,这是因为-

ķ数组得分了
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 <n时,更新(将i增加1),执行-

    • 如果A [i]> = n,则-

    • minI:= i + 1

    • (将cnt [minI]增加1)

    • maxi:= i +(n-A [i])

    • 如果maxi + 1 <n,则-

    • 忽略以下部分,跳至下一个迭代

    • cnt [maxi +减少1]减1

    • minI:= 0,(将cnt [minI]增加1)

    • maxI:= i-A [i]

    • 如果maxI + 1 <n,则-

    • 如果i + 1 <n,则-

    • cnt [maxI +减少1]减1

    • cnt [i +增加1]加1

    • 如果A [i] <= i,则-

    • 除此以外

    • maxCnt:= -1,温度:= 0

    • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

      • maxCnt:=温度

      • ret:=我

      • temp:= temp + cnt [i]

      • 如果temp> maxCnt,则-

    • 返回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