栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/942619.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号