假设我们有一个数组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