题目描述
给定一个数组A,n是它的长度。假定Bk为将数组A循环右移k位后的结果。我们定义一个 旋转函数F,如下:
求F(0),F(1),…,F(n-1)中的最大值
原题以及例子如下,
如果没有时间的限制,那么这道题可以很容易的使用暴力求解法。可惜并不能。那么这个时候就要观察了,既然不能暴力求解,那么F(k)之间肯定会存在一种联系。这里有个很巧妙的地方,如下所示
Bk[i] = Bk-1[i -1](i != 0)
Bk[0] = Bk-1[n - 1]
由上面两个式子可以得到
F(k) = 0 * Bk-1[n-1] + 1 * Bk-1[0] + … + (n-1)Bk-1[n-2]
F(k-1) = 0 * Bk-1[0] + 1 * Bk-1[1] + … + (n-1)Bk-1[n-1]
F(k) - F(k-1) = Bk-1[0] + Bk-1[1] + … + Bk-1[n-2] + Bk-1[n-1] - n*Bk-1[n-1]
很明显,前面的n项为数组A中所有元素之和,很容易就得到了F(k)与F(k-1)之间的关系,减少了很大的计算量。这种题代码量一般都不大,主要是能观察出他们之间的关系。之后慢慢计算就好了,具体代码如下,
class Solution {
public:
int maxRotateFunction(vector<int>& A) {
int sum = 0, temp = 0;
int size = A.size();
for (int i = 0; i < size; ++i) {
sum += A[i];
temp += i * A[i];
}
int max = temp;
for (int i = 1; i < size; ++i) {
int pos = size - i;
temp = sum + temp - size * A[pos];
max = max > temp ? max : temp;
}
return max;
}
};