LeetCode每日一题:LeetCode 798. 得分最高的最小轮调

LeetCode 798. 得分最高的最小轮调

不等式推到出每个数论调不加分的区间,如果最后累加的不加分区间最少,那就是论调加分最多。通过差分数组维护不加分的区间。
不等式推到如下:
i − k < a [ i ] i-k<a[i]ik<a[i] && 0 < = i − k < = n − 1 0<=i-k<=n-10<=ik<=n1
得出范围为:i − a [ i ] + 1 < = k a n d k < = i i-a[i]+1<=k and k<=iia[i]+1<=kandk<=i

class Solution {
public:
    int bestRotation(vector<int>& A) {
        int n = A.size();
        vector<int> b(n + 1);
        for (int i = 0; i < n; i ++ ) {
            int l = i - A[i] + 1, r = i;
            if (l >= 0) {
                b[l] ++ , b[r + 1] --;
            }
            else {
                b[0] ++ , b[r + 1] -- ;
                b[l + n] ++ , b[n] -- ;
            }
        } 

        int res = INT_MAX, k = 0;
        for (int i = 0, sum = 0; i < n; i ++ ) {
            sum += b[i];
            if (sum < res) {
                res = sum;
                k = i;
            }
        }
        return k;
    }
};

版权声明:本文为MATLAB2020ab原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。