LeetCode刷题记录 |
- 🌐 我的博客主页:iiiiiankor
- 🎯 如果你觉得我的内容对你有帮助,不妨点个赞👍、留个评论✍,或者收藏⭐,让我们一起进步!
- 📝 专栏系列:LeetCode 刷题日志
- 🌱 文章内容来自我的学习与实践经验,如果你有任何想法或问题,欢迎随时在评论区交流讨论。让我们一起探索更多的可能!🚀
文章目录
- 📜题目描述
- 💡解题思路
- ⌨C++代码
📜题目描述
- 旋转函数
难度:中等
给定一个长度为 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
💡解题思路
最直接的思路就是,直接一个个旋转尝试,直到找到最大值,但是看这一题的难度也就知道了,暴力的方法肯定通过不了,复杂度太高了!
没错就是直接套入公式. 然后进行相减,就会发现有很多项直接消掉了!
尝试把所给公式代入具体值
即 F(2) - F(1) = sum{ arr[i] } - arr[n-2] * n
由上面归纳可以得到
F(K) - F(K-1) = sum(arr[i]) - n*arr[n-K]
(k>=1)
因此可以通过迭代求出每一个F(K),找出最大值即可
其中F(0)可以首先求出,作为max的初始值
⌨C++代码
class Solution {
public: int maxRotateFunction(vector<int>& nums) { // F(k) = F(k-1) + sum - nums[n-k] int sum = 0; int Fk = 0; // 计算 sum 和初始 F(0) for (size_t i = 0; i < nums.size(); ++i) { sum += nums[i]; // 计算 sum Fk += i * nums[i]; // 计算 F(0) } int max = Fk; // 计算 F(k) 对于 k = 1 到 n-1 for (size_t i = 1; i < nums.size(); ++i) { Fk = Fk + sum - nums.size() * nums[nums.size() - i]; // F(k) 计算 if (Fk > max) { max = Fk; // 更新最大值 } } return max; }
};