目录
1. 问题描述
2. 解题分析
?3. 代码实现
1. 问题描述
给定一个长度为?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
2. 解题分析
? ? ? ? 暴力枚举当然可以得到答案。但是,不应该满足于此。
? ? ? ? 但是,考虑到旋转的特性,我们可以得到如下递推关系:
?
More generally,?
?
?3. 代码实现
from typing import List
class Solution:
def maxRotateFunction(self, nums: List[int]) -> int:
if len(nums)==1:
return 0
# Calculate F(0) and sum of nums
nums_sum = 0
F = 0
N = len(nums)
for k in range(N):
nums_sum += nums[k]
F += k*nums[k]
maxvalue = F
for k in range(1,N):
print(k,F)
F = nums_sum + F - N * nums[(N-k)%N]
maxvalue = F if F> maxvalue else maxvalue
return maxvalue
if __name__ == "__main__":
sln = Solution()
nums = [4,3,2,6]
print(sln.maxRotateFunction(nums))
????????执行用时:264 ms, 在所有?Python3?提交中击败了89.73%的用户
????????内存消耗:22 MB, 在所有?Python3?提交中击败了61.98%的用户
? ? ? ? 回到总目录:笨牛慢耕的Leetcode每日一题总目录(动态更新。。。)?
|