题目:https://leetcode-cn.com/problems/smallest-rotation-with-highest-score/
差分
分析
- 对于每一项,讨论其不同的轮调步长
- 注意到,得分的关键是:任何「值」小于或等于「其索引」的项都可以记作一分
- 情况一:「值」<=「其索引」
- 步长 [ 0, i-nums[i] ] 的情况都能 +1 分
- 步长 [ (i-nums[i]+1)%len, i ] 的情况都不计分
- 步长 [ (i+1)%len , ] 的情况都能 +1 分
- 情况二:「值」>「其索引」
- 步长 [ 0, i ] 的情况都不记分
- 步长 [ (i+1)%n, (n+i-nums[i])%n ] 的情况都能 +1 分
- 步长 [ (n+i-nums[i]+1)%n, ] 都不计分
class Solution:
def bestRotation(self, nums: List[int]) -> int:
n = len(nums)
dp = [0]*n #按k统计
for i in range(n):
if nums[i] <= i:
dp[0] += 1
dp[(i+1)%n] += 1
dp[(n+i-nums[i]+1)%n] += -1
ans = 0
for i in range(1,n):
dp[i] += dp[i-1]
ans = i if dp[i]>dp[ans] else ans
return ans