396. Rotate Function

来源:互联网 发布:中国水果消费数据统计 编辑:程序博客网 时间:2024/06/11 07:32

Given an array of integers A and let n to be its length.

Assume Bk 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 105.

Example:

A = [4, 3, 2, 6]F(0) = (0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) = 0 + 3 + 4 + 18 = 25F(1) = (0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) = 0 + 4 + 6 + 6 = 16F(2) = (0 * 2) + (1 * 6) + (2 * 4) + (3 * 3) = 0 + 6 + 8 + 9 = 23F(3) = (0 * 3) + (1 * 2) + (2 * 6) + (3 * 4) = 0 + 2 + 12 + 12 = 26So the maximum value of F(0), F(1), F(2), F(3) is F(3) = 26.
这道题你可以按他的等式来计算每一个Fn,时间复杂度是 O(n2)。代码如下:

public class Solution {    public int maxRotateFunction(int[] A) {        if (A.length == 0) {            return 0;        }        int max = Integer.MIN_VALUE;        int Fn = 0;        for (int i = 0; i < A.length; i++) {            for (int j = 0; j < A.length; j++) {                if (i + j < A.length)                    Fn += A[i + j] * j;                else                     Fn += A[i + j - A.length] * j;            }            max = Math.max(max, Fn);            Fn = 0;        }        return max;    }}
也可以推出来 Fn 的递推关系,推到过程如下:

F(k) = 0 * Bk[0] + 1 * Bk[1] + ... + (n-1) * Bk[n-1]F(k+1) = 0 * Bk[n-1] + 1 * Bk[0] + ... + (n-2) * Bk[n-3] + (n-1) * Bk[n-2]

Then,

F(k+1) - F(k) = Bk[0] + Bk[1] + Bk[2] + ... + Bk[n-1] - (n)Bk[n-1]              = (Bk[0] + ... + Bk[n-1]) - (n)Bk[n-1]              = sum - (n)Bk[n-1]

Thus,

F(k+1) = F(k) + sum - (n)Bk[n-1]
代码如下:

public class Solution {    public int maxRotateFunction(int[] A) {        if (A.length == 0) {            return 0;        }        int Fn = 0;        int sum = 0;        for (int i = 0; i < A.length; i++) {            Fn += i * A[i];            sum += A[i];        }        int max = Fn;        for (int i = A.length - 1; i >= 0; i--) {            Fn = Fn + sum - A.length * A[i];            max = Math.max(max, Fn);        }        return max;    }}


0 0
原创粉丝点击