798. Smallest Rotation with Highest Score

Difficulty:
Related Topics:
Similar Questions:

    Problem

    You are given an array nums. You can rotate it by a non-negative integer k so that the array becomes [nums[k], nums[k + 1], ... nums[nums.length - 1], nums[0], nums[1], ..., nums[k-1]]. Afterward, any entries that are less than or equal to their index are worth one point.

    Return **the rotation index *k* that corresponds to the highest score we can achieve if we rotated nums by it**. If there are multiple answers, return the smallest such index k.

      Example 1:

    Input: nums = [2,3,1,4,0]
    Output: 3
    Explanation: Scores for each k are listed below: 
    k = 0,  nums = [2,3,1,4,0],    score 2
    k = 1,  nums = [3,1,4,0,2],    score 3
    k = 2,  nums = [1,4,0,2,3],    score 3
    k = 3,  nums = [4,0,2,3,1],    score 4
    k = 4,  nums = [0,2,3,1,4],    score 3
    So we should choose k = 3, which has the highest score.
    

    Example 2:

    Input: nums = [1,3,0,2,4]
    Output: 0
    Explanation: nums will always have 3 points no matter how it shifts.
    So we will choose the smallest k, which is 0.
    

      Constraints:

    Solution

    class Solution {
        public int bestRotation(int[] A) {
            int[] count = new int[A.length + 1];
            int len = A.length;
            for(int index = 0; index < A.length; index ++){
                int num = A[index];
                if(index < num){
                    int maxLenK = (index + 1) % len;
                    int ori = (index + len - num) % len;
                    count[maxLenK] ++;
                    count[ori + 1] --;
                }else{      // index >= num
                    int ori = (index + len - num) % len;
                    count[0] ++;
                    count[ori + 1] --;
                    if(index != len - 1){
                        count[(index + 1) % len] ++;
                        count[len] --;
                    }
                }
            }
            int max = count[0];
            int res = 0;
            for(int i = 1; i < len; i ++){
                count[i] = count[i] + count[i - 1];
                if(count[i] > max){
                    max = count[i];
                    res = i;
                }            
            }
            return res;
        }
    }
    

    Explain:

    nope.

    Complexity: