396. Rotate Function
Given an array of integers A and let n to be its length.
Assume $B_k$ to be an array obtained by rotating the array A k positions clock-wise, we define a “rotation function” F on A 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 $10^5$.
Example:
暴力法
这个没啥好说的,时间复杂度O($n^2$), 超时了
递推公式,数学
这个要用到数学推到,请参考链接:https://discuss.leetcode.com/topic/58459/java-o-n-solution-with-explanation. 时间复杂度为O(n)
|
|
递推公式,更好理解
https://discuss.leetcode.com/topic/58616/java-solution-o-n-with-non-mathametical-explaination
把Discuss里的解释贴在这里:
Consider we have 5 coins A,B,C,D,E
According to the problem statement
F(0) = (0A) + (1B) + (2C) + (3D) + (4E)
F(1) = (4A) + (0B) + (1C) + (2D) + (3E)
F(2) = (3A) + (4B) + (0C) + (1D) + (2*E)
This problem at a glance seem like a difficult problem. I am not very strong in mathematics, so this is how I visualize this problem
We can construct F(1) from F(0) by two step:
taking away one count of each coin from F(0), this is done by subtracting “sum” from “iteration” in the code below
after step 1 F(0) = (-1A) + (0B) + (1C) + (2D) + (3*E)Add n times the element which didn’t contributed in F(0), which is A. This is done by adding “A[j-1] * len” in the code below.
after step 2 F(0) = (4A) + (0B) + (1C) + (2D) + (3E)
At this point F(0) can be considered as F(1) and F(2) to F(4) can be constructed by repeating the above steps.
Hope this explanation helps, cheers!
|
|