LeetCode中等题之旋转函数

news/2024/11/23 21:59:05/

题目

给定一个长度为 n 的整数数组 nums 。
假设 arrk 是数组 nums 顺时针旋转 k 个位置后的数组,我们定义 nums 的 旋转函数 F 为:
F(k) = 0 * arrk[0] + 1 * arrk[1] + … + (n - 1) * arrk[n - 1]
返回 F(0), F(1), …, F(n-1)中的最大值 。
生成的测试用例让答案符合 32 位 整数。
示例 1:
输入: nums = [4,3,2,6]
输出: 26
解释:
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 。
示例 2:
输入: nums = [100]
输出: 0
提示:
n == nums.length
1 <= n <= 10^5
-100 <= nums[i] <= 100
来源:力扣(LeetCode)

解题思路

  题目的做法比较易懂,按照示例1的意思就是下标不动数组每个元素右移或者元素不动,下标左移,我们任取一种固定另外一种就可以完成题目的要求。

class Solution:def maxRotateFunction(self, nums: List[int]) -> int:index=deque([i for i in range(len(nums))]) #旋转下标MAX=-float('inf')for i in range(len(nums)):s=0for j in range(len(nums)):s+=nums[j]*index[j]if s>MAX:MAX=sindex.append(index.popleft()) #下标左移return MAX

在这里插入图片描述
  很明显每次都计算全部的数组和其下标,复杂度是O(n^2)所以非常容易超时,因此我们需要利用数学上的方法使得计算量减少,没有思路的话可以在纸上写写划划,当我们将F(0),F(1)的表达式写出来的时候就会发现,这其实就是高中前n项和常用的手段,高斯当年计算的精华错位相减。

class Solution:def maxRotateFunction(self, nums: List[int]) -> int:s,MAX,S,k=0,-float('inf'),sum(nums),1for i,j in enumerate(nums):s+=i*jfor i in range(len(nums)):if s>MAX:MAX=ss+=S-len(nums)*nums[-k]k+=1return MAX

在这里插入图片描述


http://www.ppmy.cn/news/605408.html

相关文章

pytorch问题索引

20220629 调试代码时候,找不到入口&#xff0c;通过下面的位置进入 20220613 各种归一化在nlp和cv中的输入输出维度 参数只包括权重&#xff0c;不包括偏置 这两个维度的范围不包括&#xff0c;不计算&#xff0c;而是在剩下的维度进行计算 concat&#xff08;dim-1&#x…

LeetCode简单题之计算字符串的数字和

题目 给你一个由若干数字&#xff08;0 - 9&#xff09;组成的字符串 s &#xff0c;和一个整数。 如果 s 的长度大于 k &#xff0c;则可以执行一轮操作。在一轮操作中&#xff0c;需要完成以下工作&#xff1a; 将 s 拆分 成长度为 k 的若干 连续数字组 &#xff0c;使得前 …

比Momentum更快:揭开Nesterov Accelerated Gradient的真面目NAG 梯度下降

d为累计梯度 作为一个调参狗&#xff0c;每天用着深度学习框架提供的各种优化算法如Momentum、AdaDelta、Adam等&#xff0c;却对其中的原理不甚清楚&#xff0c;这样和一条咸鱼有什么分别&#xff01;&#xff08;误&#xff09;但是我又懒得花太多时间去看每个优化算法的原始…

LeetCode简单题之重新排列日志文件

题目 给你一个日志数组 logs。每条日志都是以空格分隔的字串&#xff0c;其第一个字为字母与数字混合的 标识符 。 有两种不同类型的日志&#xff1a; 字母日志&#xff1a;除标识符之外&#xff0c;所有字均由小写字母组成 数字日志&#xff1a;除标识符之外&#xff0c;所有…

深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

深度学习优化函数详解系列目录 深度学习优化函数详解&#xff08;0&#xff09;– 线性回归问题 深度学习优化函数详解&#xff08;1&#xff09;– Gradient Descent 梯度下降法 深度学习优化函数详解&#xff08;2&#xff09;– SGD 随机梯度下降 深度学习优化函数详解&…

LeetCode简单题之统计字符串中的元音子字符串

题目 子字符串 是字符串中的一个连续&#xff08;非空&#xff09;的字符序列。 元音子字符串 是 仅 由元音&#xff08;‘a’、‘e’、‘i’、‘o’ 和 ‘u’&#xff09;组成的一个子字符串&#xff0c;且必须包含 全部五种 元音。 给你一个字符串 word &#xff0c;统计并返…

深度学习优化方法-AdaGrad 梯度下降

梯度下降算法、随机梯度下降算法&#xff08;SGD&#xff09;、小批量梯度下降算法&#xff08;mini-batch SGD&#xff09;、动量法&#xff08;momentum&#xff09;、Nesterov动量法有一个共同的特点是&#xff1a;对于每一个参数都用相同的学习率进行更新。但是在实际应用中…

LeetCode简单题之三除数

题目 给你一个整数 n 。如果 n 恰好有三个正除数 &#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在整数 k &#xff0c;满足 n k * m &#xff0c;那么整数 m 就是 n 的一个 除数 。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;fal…