798. 得分最高的最小轮调(困难 差分数组)

本文介绍了如何解决LeetCode上的798题,即找到数组中得分最高的最小轮调。通过分类讨论,分析不同情况下元素移动对得分的影响,并用动态规划的方法计算每个位置的得分,最终找到最佳轮调。代码实现采用C++,通过维护差分数组diff来更新得分,遍历得到最高且最小的k值。
摘要由CSDN通过智能技术生成

题目链接

798. 得分最高的最小轮调 - 力扣(LeetCode) (leetcode-cn.com)

思路参考

力扣​​​​​​@himymBenhttps://leetcode-cn.com/problems/smallest-rotation-with-highest-score/solution/pythonjavajavascriptgo-chai-fen-shu-zu-b-xhvy/

分类讨论

        当 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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值