【LeetCode】396. 旋转函数

127 阅读2分钟

image.png

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第25天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

image.png

  • 题目示例

image.png

  • 题目解析

    • 本题只有一个参数nums,是一个整数数组
    • nums数组长度在1~10^5
    • nums[i]是整数-100~100

二、思路分析:

我们拿到本题,要求对nums列表中元素进行满足 F(k) = 0 * arrk[0] + 1 * arrk[1] + ... + (n - 1) * arrk[n - 1] 函数,返回最大数。

根据题目示例,只要对nums列表中元素顺时针遍历,最能想到的是滑动窗口思想

  • 创建一个临时的列表tmp_nums被赋值为nums+nums拼接
  • 使用嵌套for循环取列表中每一个索引,截取tmp_list[i:len(nums)+i]进行∑索引*元素
  • 对求出的和Sum取最大的,直到遍历完nums列表

image.png

简单直接的方法,一股脑使用python实现如下代码如下:

class Solution(object):
    def maxRotateFunction(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """

        ans = 0
        n = len(nums)
        tmp_nums = nums + nums
        for i in range(n):
            Sum = 0
            for num in range(n):
                Sum = Sum + num*tmp_nums[i:n+i][num]
            ans = max(Sum,ans)
        return ans

测试了几个测试用例,一看没问题,提交结果被NG啦。超出时间限制 image.png

根据上面方法,使用嵌套for循环处理这么多数据,效率非常低的。我们需要另寻其他的方法。

重新查看题目示列一,推导一下思路如图所示:

image.png

被我们发现了,F(k)- F(k-1) = SumNums - n*nums[n-k-1] n=len(nums)

旋转函数的规律被我们推导出来,实现思路就非常容易了:

  • 首先使用for循环求出nums列表中元素和以及F(0)的结果
  • 再使用for循环取遍历,求出其他F(k)值,并选择最大数
class Solution(object):
    def maxRotateFunction(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        ans,pre,sumNums = 0,0,0
        n = len(nums)
        for i in range(n):

            pre = pre + i*nums[i]
            sumNums = sumNums + nums[i]
        ans = pre
        for i in range(1,n):

            f  = pre -sumNums + n*nums[i-1]
            ans = max(f,ans)
            pre = f
        
        return ans

三、总结:

本题我们需要对旋转函数进行推导得出公式,AC记录如下:

image.png

时间复杂度O(n),空间复杂度O(n)

以上是本期内容,欢迎大佬们点赞评论,下期见~~