题目链接
798. 得分最高的最小轮调 - 力扣(LeetCode) (leetcode-cn.com)
思路参考
分类讨论
当 i >= nums[i],不移动本身就会对答案作出一个贡献,即diff[0]+=1;
当k逐渐变大时,i 会向左移动出nums[i],那个时候对答案不作出贡献了,即diff[i - num + 1] -= 1;持续移动超过最左端0以后会回到n-1,又会对答案作出贡献,即diff[i + 1] += 1。
当 i < nums[i],不移动本身不会对答案作出贡献。移动超过最左端0回到n-1,会对答案作出贡献,即diff[i + 1] += 1;
当继续移动,超过 nums[i] 回到[0, nums[i] - 1] 之间时,又不会再对答案做出贡献了,即diff[i - nums[i] + n + 1] -= 1。
我们只需要对diff进行遍历,维护每个时刻有多少个坐标满足差小于等于0,最终返回最大且最小的k即可。
class Solution {
public:
int bestRotation(vector<int>& nums) {
int n = nums.size();
vector<int> diff(n+1);
int score = 0, count = 0, res = 0;
for(int i = 0; i < n; i++){
if(i >= nums[i]){
diff[0]++;
diff[i-nums[i]+1]--;
diff[i+1]++;
} else {
diff[i+1]++;
diff[i+1+n-nums[i]]--;
}
}
for(int i = 0; i < n; i++){
score += diff[i];
if(count < score) {
count = score;
res = i;
}
}
return res;
}
};