思路
这道题若用暴力做法可能超时,其规律性较强,可利用前面的计算结果来计算当前状态的结果
例:
nums = [4,3,2,6]
F(0) = (0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) = 0 + 3 + 4 + 18 = 25
F(1) = (0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) = 0 + 4 + 6 + 6 = 16
…
F(0) 中 (0 * 4) + (1 * 3) + (2 * 2)
与 F(1) 中 (1 * 4) + (2 * 3) + (3 * 2)
它们的差值为 4 + 3 + 2 = 4 + 3 + 2 - 6 = sum(nums) - 6
F(0) 中 (3 * 6)
与 F(1) 中 (0 * 6)
它们的差值为 3 * 6 = (len(nums) - 1) * 6
两差值相加:sum(nums) - len(nums) * 6
F(1) = F(0) + sum(nums) - len(nums) * 6
可以发现该差值表达式除了 6 之外,其余元素与F(i)无关,所以只需要找到 i 与6的对应关系即可
那F(0)、F(1)的差值中包含的6来自何处?
不难发现,6为F(0)的尾部元素,F(1)的头部元素
又因为数组按照顺时针旋转,所以 i 与 6的对应关系就找到了
F(i)的尾部元素:last = nums[len(nums) - 1 - i]
所以,有F(i)的递推表达式:
F(i+1) = F(i) + sum(nums) - len(nums) * nums[len(nums) - 1 - i]
代码
import numpy as np
class Solution:
def maxRotateFunction(self, nums: List[int]) -> int:
len_nums = len(nums)
Sum = int((np.arange(len_nums) * np.array(nums)).sum())
Sum_nums = sum(nums)
Max = Sum
flag = len_nums - 1
while(flag > 0):
Sum += Sum_nums - nums[flag]*len_nums
if(Sum>Max):
Max = Sum
flag -= 1
return Max