> For the complete documentation index, see [llms.txt](https://hao-fu-1.gitbook.io/oj/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hao-fu-1.gitbook.io/oj/math/zhao-gui-lv/rotate-function.md).

# 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](http://www.cnblogs.com/grandyang/p/5860706.html)也靠找规律，而用傻方法肯定超时，然后博主发现自己脑子不够活，很难想到正确的方法，说出来全是泪啊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).
