[LeetCode]Rotate Function

题目描述:

LeetCode 396. Rotate Function

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 = 25
F(1) = (0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) = 0 + 4 + 6 + 6 = 16
F(2) = (0 * 2) + (1 * 6) + (2 * 4) + (3 * 3) = 0 + 6 + 8 + 9 = 23
F(3) = (0 * 3) + (1 * 2) + (2 * 6) + (3 * 4) = 0 + 2 + 12 + 12 = 26

So the maximum value of F(0), F(1), F(2), F(3) is F(3) = 26.

题目大意:

给定一个整数数组A,其长度为n。

假设Bk是将数组A顺时针旋转k个位置得到的数组,我们定义一个“旋转函数”F如下所示:

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

计算F(0), F(1), ..., F(n-1)的最大值

注意:

n确保小于10^5

解题思路:

假设数组A的长度为5,其旋转函数F的系数向量如下所示:

0 1 2 3 4
1 2 3 4 0
2 3 4 0 1
3 4 0 1 2
4 0 1 2 3

用每一行系数与其上一行做差,差值恰好为sum(A) - size * A[size - x],其中x为行数

因此,通过一次遍历即可求出F(0), F(1), ..., F(n-1)的最大值。

Python代码:

class Solution(object):
    def maxRotateFunction(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        size = len(A)
        sums = sum(A)
        sumn = sum(x * n for x, n in enumerate(A))
        ans = sumn
        for x in range(size - 1, 0, -1):
            sumn += sums - size * A[x]
            ans = max(ans, sumn)
        return ans

 

本文链接:http://bookshadow.com/weblog/2016/09/11/leetcode-rotate-function/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。

如果您喜欢这篇博文,欢迎您捐赠书影博客: ,查看支付宝二维码

Pingbacks已关闭。

评论
  1. Joe Hisaishi Joe Hisaishi 发布于 2016年9月15日 03:01 #

    -- 用每一行系数与其上一行做差,差值恰好为<code>sum(A) + size * A[size - x]</code>
    ++ 用每一行系数与其上一行做差,差值恰好为<code>sum(A) - size * A[size - x]</code>

  2. 在线疯狂 在线疯狂 发布于 2016年9月15日 09:50 #

    感谢更正,已经修改 :D

张贴您的评论