题目描述
题目分析
先思考暴力做法,遍历每一种旋转后的数组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;
}
};