首先尝试直接计算,记录最大值,会超时。
思路
通过观察
f(0)=0×A[0]+1×A[1]+2×A[2]+3×A[3].
f(1)=1×A[0]+2×A[1]+3×A[2]+0×A[3].
f(2)=2×A[0]+3×A[1]+0×A[2]+1×A[3].
f(3)=3×A[0]+0×A[1]+1×A[2]+2×A[3].
发现function之间有递归关系
f(1)=f(0)+sum−4×A[3].
f(2)=f(1)+sum−4×A[2].
f(3)=f(2)+sum−4×A[1].
Solution
int maxRotateFunction(vector<int>& A)
{
int k = A.size();
int sum = 0; // A中所有元素和
int res = 0; // 结果:记录最大值
int temp = 0; // function(i)
for(int i = 0; i < k; i++)
{
sum += A[i];
temp += i * A[i];
}
res = temp;
for(int i = 1; i < k; i++)
{
temp = temp + sum - k * A[k - i % k];
if(temp > res)
res = temp;
}
return res;
}
Tip
前面加一些判断条件,明显减少了最后判定的时间。
if(k == 1)
return 0;
else if(k == 2)
return max(A[0], A[1]);