力扣798.得分最高的最小轮调
-
差分数组
- 考虑两种情况:
- 1.当前位置可以得分
- 往左移动 由于下标不断变大,显然每个位置都是可以记分的[0,i]
- 当移动下标到nums[i]时,最后一次可以计分,此时轮调的次数为i - nums[i] + 1
- 2.当前位置不可得分
- 往左移动 下标变小,显然只会让差值变大一直是不可得分[0,i]
- 直到-1,会循环到下标n-1,此时一定可以得分,并继续往左移动至nums[i]-1
- 此时轮调次数为n - (nums[i] - i) + 1
-
class Solution { public: int bestRotation(vector<int>& nums) { int n = nums.size(); vector<int> move(n,0); for(int i=0;i<n;i++) { if(nums[i] <= i) { //不移动就可以得分 move[0] ++; //左移至nums[i]-1 move[(i-nums[i]+1)%n] --; //循环至n-1 move[(i+1)%n] ++; } else { //循环至n-1 move[(i+1)%n] ++; //左移至nums[i]-1 move[(n-(nums[i]-i)+1)%n] --; } } int score = 0; int maxS = 0; int ans = 0; for(int i=0;i<n;i++) { score += move[i]; if(score > maxS) { maxS = score; ans = i; } } return ans; } };