求解最大得分,不需要计算每个k的实际得分,只需要计算差值就行。
从k=1的状态到k=2的状态,会有以下两种计分变化:
1,一定只加1分,从位置0到位置N-1的元素一定是得分的
2,减分若干,当元素值等于下标正好是0分,往左移动一个会减分,之后不会再减。
当k继续增大时,依次类推。
解释:
N-nums[i]+i+1 是 元素 nums[i] 从起始位置移动k步 到达 下标为nums[i]的左侧
/*
* @lc app=leetcode id=798 lang=cpp
*
* [798] Smallest Rotation with Highest Score
*/
// @lc code=start
class Solution {
public:
int bestRotation(vector<int>& nums) {
int N = nums.size();
vector<int> kloss(N, 0);
for(int i=0;i<N;i++){
kloss[(N-nums[i]+i+1)%N] ++; // 开始丢分
}
int score = 0;
int ans = 0;
int res = 0;
for(int i=1;i<N;i++){
score = score - kloss[i] + 1;
if(ans < score){
ans = score;
res = i;
}
}
return res;
}
};
// @lc code=end