Leetcode题库396. 旋转函数(python 实现)

文章目录

思路

这道题若用暴力做法可能超时,其规律性较强,可利用前面的计算结果来计算当前状态的结果
例:
nums = [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(0) 中 (0 * 4) + (1 * 3) + (2 * 2)
与 F(1) 中 (1 * 4) + (2 * 3) + (3 * 2)
它们的差值为 4 + 3 + 2 = 4 + 3 + 2 - 6 = sum(nums) - 6
F(0) 中 (3 * 6)
与 F(1) 中 (0 * 6)
它们的差值为 3 * 6 = (len(nums) - 1) * 6
两差值相加:sum(nums) - len(nums) * 6

F(1) = F(0) + sum(nums) - len(nums) * 6
可以发现该差值表达式除了 6 之外,其余元素与F(i)无关,所以只需要找到 i 与6的对应关系即可

那F(0)、F(1)的差值中包含的6来自何处?

不难发现,6为F(0)的尾部元素,F(1)的头部元素
又因为数组按照顺时针旋转,所以 i 与 6的对应关系就找到了
F(i)的尾部元素:last = nums[len(nums) - 1 - i]

所以,有F(i)的递推表达式:
F(i+1) = F(i) + sum(nums) - len(nums) * nums[len(nums) - 1 - i]

代码

import numpy as np
class Solution:
    def maxRotateFunction(self, nums: List[int]) -> int:
        len_nums = len(nums)
        Sum = int((np.arange(len_nums) * np.array(nums)).sum())
        Sum_nums = sum(nums)
        Max = Sum
        flag = len_nums - 1
        while(flag > 0):
            Sum += Sum_nums - nums[flag]*len_nums
            if(Sum>Max):
                Max = Sum
            flag -= 1
        
        return Max
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值