设数组长度为n, nums[i] 的下标为i,经过k的轮调后,下标变成id = (i - k + n) % n,由于下标需要符合0 <= id <= n - 1 即 0 <= (i - k + n) % n <= n - 1,得出k >= (i + 1) % n要想轮调后的 x = nums[id] 记1分,则id >= x,即 (i - k + n) % n >= x 可得出,k <= (i - x + n) % n,综上可得k的取值范围:(i + 1) % n <= k <= (i - x + n) % n
所得到的k的取值范围指的是,下标为i的数,经过取值范围内的k的轮调之后,依然可以记1分,我们令diff[]数组 为差分数组,在k的范围内都加1,只需要在左端点加1,右端点的下一个点减1
代码如下:
class Solution {
public int bestRotation(int[] nums) {
int n = nums.length;
int[] diff = new int[n];
for(int i = 0; i < nums.length; i++){
int l = (i + 1) % n;
int r = (i - nums[i] + 1 + n) % n;
diff[l]++;
diff[r]--;
if(l >= r) diff[0]++;
}
int maxx = 0;
int maxid = 0;
int points = 0;
for(int i = 0; i < nums.length; i++){
points = points + diff[i];
if(maxx < points){
maxx = points;
maxid = i;
}
}
return maxid;
}
}