前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【leetcode刷题】T197-旋转函数

【leetcode刷题】T197-旋转函数

作者头像
木又AI帮
发布2019-11-14 12:45:13
3070
发布2019-11-14 12:45:13
举报
文章被收录于专栏:木又AI帮木又AI帮

【题目】

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

假设 Bk 是数组 A 顺时针旋转 k 个位置后的数组,我们定义 A 的“旋转函数” F 为:

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

计算F(0), F(1), …, F(n-1)中的最大值。

注意: 可以认为 n 的值小于 10^5。

代码语言:javascript
复制
示例:
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

所以 F(0), F(1), F(2), F(3) 中的最大值是 F(3) = 26 。

【思路】

暴力破解:不断循环(累加--比较--旋转--累加--比较--旋转)

时间复杂度太高,不能通过。

看样子有技巧呀。

假设有三个元素A, B, C

f(0) = 0*A + 1*B +2*C

f(1) = 0*C + 1*A +2*B

f(2) = 0*B + 1*C +2*A

f(1) = f(0) + (A+B+C) - 3*C

f(2) = f(1) + (A+B+C) - 3*B

推广到一般情况

f(t) = f(t-1) + (A+B+C+…) - n*nums[n-1-t]

其中,nums表示该数组,n表示数组长度

【代码】

python版本

代码语言:javascript
复制
class Solution(object):
    def maxRotateFunction(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        n = len(A)
        if n == 0:
            return 0

        tmp = sum([i * A[i] for i in range(n)])
        res = tmp
        ABCD = sum(A)
        for i in range(n-1):
            tmp = tmp + ABCD - n * A[n-1-i]
            res = max(res, tmp)
        return res
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 木又AI帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档