一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第25天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 本题只有一个参数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列表
简单直接的方法,一股脑使用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啦。超出时间限制
根据上面方法,使用嵌套for循环处理这么多数据,效率非常低的。我们需要另寻其他的方法。
重新查看题目示列一,推导一下思路如图所示:
被我们发现了,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记录如下:
时间复杂度O(n),空间复杂度O(n)
以上是本期内容,欢迎大佬们点赞评论,下期见~~