Rotate Function

https://leetcode.com/problems/rotate-function/description/

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).

Thoughts

http://www.cnblogs.com/grandyang/p/5869791.html

现在想想找规律的能力真的挺重要,比如之前那道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

那么,我们通过仔细观察,我们可以得出下面的规律:

F(1) = F(0) + sum - 4D

F(2) = F(1) + sum - 4C

F(3) = F(2) + sum - 4B

Code

class Solution {
    public int maxRotateFunction(int[] A) {
        int sum = 0, f = 0, n = A.length;
        for (int i = 0; i < n; i++) {
            sum += A[i];
            f += i * A[i];
        }

        int max = f;
        for (int i = 1; i < n; i++) {
            f = f + sum - n * A[n - i];
            max = Math.max(f, max);
        }

        return max;
    }
}

Analysis

时间复杂度O(N), 空间O(1).

Last updated