📅  最后修改于: 2023-12-03 14:56:54.631000             🧑  作者: Mango
给定一个包含 n 个整数的数组。数组可以被旋转任意次数,旋转后的数组可以表示为 A[0], A[1], ..., A[n-1] 的形式,其中 A[i] 是原数组中第 i 个元素。
例如,数组 [0,1,2,3,4,5,6,7] 在旋转后可能变为 [3,4,5,6,7,0,1,2]。
假设数组中无重复元素,则给定数组的所有旋转中,你需要找到最大的 i * A[i]。
输入: [3,1,2,4] 输出: 25
设原数组为 a,旋转后的数组为 b,那么 a[i] 对应的是 b[(i+k)%len],其中 k 是旋转后的偏移量。
将上式拆开,得到 i*a[i] = (i+k)b[(i+k)%len] - kb[(i+k)%len]。
上式右侧的一项 k*b[(i+k)%len] 对于所有元素均相同,我们只需要求出右侧的另一项 (i+k)*b[(i+k)%len] 的最大值即可。
观察到右侧的新数组 (i+k)*b[(i+k)%len] 必须是连续的子序列,因此可以使用动态规划的思想来优化求解。
设 dp[i] 表示以 i 结尾的最大子序列和,状态转移方程为:
dp[i] = max(dp[i-1]+nums[i], nums[i])
最后,对 dp 数组求最大值即为所求。
def maxRotateFunction(nums: List[int]) -> int:
n = len(nums)
total = sum(nums)
dp = [0] * n
dp[0] = sum(i * nums[i] for i in range(n))
res = dp[0]
for i in range(1, n):
dp[i] = dp[i-1] + total - n * nums[n-i]
res = max(res, dp[i])
return res