题目描述
题目分析
先思考暴力做法,遍历每一种旋转后的数组arrk,对每一个arrk求一次F函数,但是时间复杂度是平方级别的,而n=10^5,必然超时,因此必须求出来一种线性或对数复杂度的算法。
我们继续思考发现,对数组的旋转实际上可以转换为对“每个数组系数的旋转”,因此,我们会发现以下规律:
据此我们确定迭代思路:首先求出旋转之前的F函数,随便再迭代n-1次,在每一次迭代中,将其中一个元素的出现次数增加n-1,再将其它元素的出现次数减1,不断更新迭代值,每次求出新迭代值时假如大于当前答案就更新答案。这种情况下,每次遍历的时间复杂度为常数级,因此,总时间复杂度就是线性的。
代码
class Solution {
public:int maxRotateFunction(vector<int>& nums) {int n = nums.size();int sum = 0;int res = 0;int cur = 0;for (int i = 0; i < n; i ++ ) {sum += nums[i];res += i * nums[i];}cur = res;for (int i = 0; i < n - 1; i ++ ) {cur = cur + (n - 1) * nums[i] - (sum - nums[i]);res = max(cur, res);}return res;}
};