首先尝试直接计算,记录最大值,会超时。
思路
通过观察
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]);
本文介绍了一种针对数组旋转后元素与其下标乘积之和的最大值问题的高效求解算法。通过发现不同旋转状态之间的递推关系,避免了直接计算所带来的超时问题。文章给出了具体的实现代码,并通过加入预判条件进一步提升了算法效率。
85

被折叠的 条评论
为什么被折叠?



