Skip to main content

396.旋转函数

标签: array, math

难度: Medium

通过率: 43.28%

原题链接: https://leetcode.com/problems/rotate-function/description/

题目描述

给定一个长度为 nn 的整数数组 numsnums。假设 arrkarr_k 是将 numsnums 顺时针旋转 kk 个位置得到的数组。定义在 numsnums 上的旋转函数 FF 如下:

F(k)=0arrk[0]+1arrk[1]++(n1)arrk[n1]F(k) = 0 \cdot arr_k[0] + 1 \cdot arr_k[1] + \ldots + (n-1) \cdot arr_k[n-1]

返回 F(0),F(1),,F(n1)F(0), F(1), \ldots, F(n-1) 的最大值。

解题思路

题目要求我们计算对数组 numsnums 的每种旋转 kk,对应的旋转函数 F(k)F(k) 的最大值。

首先,我们可以计算出 F(0)F(0),并观察 F(k)F(k)F(k1)F(k-1)的关系:

F(k)=F(k1)+sum(nums)nnums[nk]F(k) = F(k-1) + \text{sum}(nums) - n \cdot nums[n-k]

这里,sum(nums)\text{sum}(nums) 是数组 numsnums 的所有元素之和。通过这个公式,我们可以根据 F(k1)F(k-1) 快速计算出 F(k)F(k)。因此,我们只需从 F(0)F(0) 开始,逐个求出 F(k)F(k) 的值,并记录其中的最大值即可。

这种方法的关键在于理解 F(k)F(k)F(k1)F(k-1) 的关系,即每次旋转增加的总和减去每个元素因旋转带来的数值变化。从而可以在 O(n)O(n) 的时间复杂度下求解。

代码实现

def maxRotateFunction(nums):
n = len(nums)
total_sum = sum(nums)
F = sum(i * num for i, num in enumerate(nums))
max_value = F
for k in range(1, n):
F += total_sum - n * nums[-k]
max_value = max(max_value, F)
return max_value

# 测试用例
print(maxRotateFunction([4,3,2,6])) # 输出:26

复杂度分析

时间复杂度为 O(n)O(n),因为我们需要遍历数组 numsnums 一次以计算初始的 F(0)F(0),然后遍历一次调整并求每一个 F(k)F(k)

空间复杂度为 O(1)O(1),因为只使用了常量额外空间进行计算。