看完题目第一想法是写一个函数用以计算f(i),然后迭代地去计算每一个f(i),ans用以记录最大值,最后返回即可,但是这样的做法时间复杂度为O(n^2),导致“一顿操作猛如虎,一看击败百分五”,然后我便毫不犹豫地点开了官方题解,果然官方不会像我一样傻,其思路是推导f(i)与f(i - 1)的关系,并利用这样的关系去计算后面的f(n), 这样得到的算法时间复杂度就为O(n),按着官方的思路,我自己去推导了这个关系式,提交过后果然好多了。
class Solution
{
int len;
int ans;
int function(int n, vector<int>& nums)
{
int cur = 0;
for (int i = 0; i < len; ++i)
{
cur += i * nums[(n + i) % len];
}
return cur;
}
public:
int maxRotateFunction(vector<int>& nums)
{
len = nums.size();
int sum = accumulate(nums.begin(), nums.end(), 0);
vector<int> dp(len, 0);
int temp = function(0, nums);
ans = temp;
for (int i = 1; i < len; ++i)
{
temp = temp + sum - len * nums[len - i];
ans = max(ans, temp);
}
return ans;
}
};