You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
那么我们就找到规律了, F(i) = F(i-1) + sum - n*A[n-i],可以写出代码如下:
class Solution {
public:
int maxRotateFunction(vector<int>& A) {
int t = 0, sum = 0, n = A.size();
for (int i = 0; i < n; ++i) {
sum += A[i];
t += i * A[i];
}
int res = t;
for (int i = 1; i < n; ++i) {
t = t + sum - n * A[n - i];
res = max(res, t);
}
return res;
}
};
Given an array of integers
A
and let n to be its length.Assume
Bk
to be an array obtained by rotating the arrayA
k positions clock-wise, we define a "rotation function"F
onA
as follow:F(k) = 0 * Bk[0] + 1 * Bk[1] + ... + (n-1) * Bk[n-1]
.Calculate the maximum value of
F(0), F(1), ..., F(n-1)
.Note:
n is guaranteed to be less than 105.
Example:
这道题是LeetCode第四次比赛的第一道题,博主第一道题就没有做出来,博主写了个O(n2)的方法并不能通过OJ的大数据集合,后来网上看大家的解法都是很好的找到了规律,可以在O(n)时间内完成。现在想想找规律的能力真的挺重要,比如之前那道Elimination Game也靠找规律,而用傻方法肯定超时,然后博主发现自己脑子不够活,很难想到正确的方法,说出来全是泪啊T.T。好了,来解题吧,我们为了找规律,先把具体的数字抽象为A,B,C,D,那么我们可以得到:
F(0) = 0A + 1B + 2C +3D
F(1) = 0D + 1A + 2B +3C
F(2) = 0C + 1D + 2A +3B
F(3) = 0B + 1C + 2D +3A
那么,我们通过仔细观察,我们可以得出下面的规律:
sum = 1A + 1B + 1C + 1D
F(1) = F(0) + sum - 4D
F(2) = F(1) + sum - 4C
F(3) = F(2) + sum - 4B
那么我们就找到规律了, F(i) = F(i-1) + sum - n*A[n-i],可以写出代码如下:
参考资料:
https://leetcode.com/problems/rotate-function/
https://leetcode.com/problems/rotate-function/discuss/87853/Java-O(n)-solution-with-explanation
https://leetcode.com/problems/rotate-function/discuss/87842/Java-Solution-O(n)-with-non-mathametical-explaination
LeetCode All in One 题目讲解汇总(持续更新中...)
The text was updated successfully, but these errors were encountered: