LeetCode每日一题——396. 旋转函数

简介: 给定一个长度为 n 的整数数组 nums 。

题目

给定一个长度为 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

思路

1.采用循环队列的思想,将每个旋转的结果枚举一遍并求对应的答案,最后取最大值(超时)

2.向右旋转一次,就相当于把当前结果减去整个数组的和,再加上数组大小乘以当前最后一位。建立在该思路上有两种解题方式

①动态规划,先确定dp[0]为正序的结果,然后根据状态转移方程dp[i] = dp[i-1] - sum + (n * nums[i-1])求解,最后取dp数组的最大值

②有限三个变量,分别记录数组的和,从每一个位置开始的结果,结果的最大值

题解

一、暴力(超时)

def maxRotateFunction1(nums):
    if len(nums) == 1:
        return 0
    res = sum([(i * nums[i]) for i in range(len(nums))])
    index = len(nums) - 1
    for j in range(len(nums)-1):
        temp = 0
        for i in range(0, len(nums)):
            temp += (i*nums[index])
            index = (index + 1) % len(nums)
        index -= 1
        res = max(res, temp)
    return res

二、动态规划

def maxRotateFunction(self, nums: List[int]) -> int:
    n = len(nums)
    dp = [0] * n
    sum, temp = 0, 0
    for i in range(n):
        sum += nums[i]
        temp += nums[i] * i
    dp[0] = temp
    for i in range(1, n):
        dp[i] = dp[i-1] - sum + (n * nums[i-1])
    return max(dp)

三、有限变量

def maxRotateFunction2(self, nums: List[int]) -> int:
        if len(nums) == 1:
            return 0
        n = len(nums)
        res, sum, temp = 0, 0, 0
        for i in range(n):
            sum += nums[i]
            temp += nums[i] * i
            res += nums[i] * i
        for i in range(1, n):
            temp = temp - sum + (n * nums[i-1])
            res = max(res, temp)
        return res
目录
相关文章
|
4月前
【bug记录】旋转链表与力扣报错:member access within null pointer of type ‘struct ListNode‘
【bug记录】旋转链表与力扣报错:member access within null pointer of type ‘struct ListNode‘
|
2月前
|
机器学习/深度学习
Leetcode第48题(旋转图像)
这篇文章介绍了LeetCode第48题“旋转图像”的解题方法,通过原地修改二维矩阵实现图像的顺时针旋转90度。
32 0
Leetcode第48题(旋转图像)
|
2月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
23 0
Leetcode第三十三题(搜索旋转排序数组)
|
4月前
|
存储 算法
LeetCode第48题旋转图像
LeetCode第48题"旋转图像"的解题方法,通过两次翻转操作——先水平翻转再对角线翻转,实现了原地旋转矩阵的效果。
LeetCode第48题旋转图像
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 11. 旋转数组的最小数字
解决剑指Offer 11题 "旋转数组的最小数字" 的三种Python实现方法:直接使用min函数、线性查找分界点和二分查找法,以找出旋转数组中的最小元素。
57 2
|
6月前
|
C语言
详解Leetcode中关于malloc模拟开辟二维数组问题,涉及二维数组的题目所给函数中的各个参数的解读
详解Leetcode中关于malloc模拟开辟二维数组问题,涉及二维数组的题目所给函数中的各个参数的解读
40 1
|
6月前
|
存储 算法 数据可视化
深入解读力扣154题:寻找旋转排序数组中的最小值 II(多种方法及详细ASCII图解)
深入解读力扣154题:寻找旋转排序数组中的最小值 II(多种方法及详细ASCII图解)
|
6月前
|
存储 算法 数据可视化
|
6月前
|
机器学习/深度学习 存储
力扣经典150题第三十六题:旋转图像
力扣经典150题第三十六题:旋转图像
36 0
|
6月前
【LeetCode刷题】二分查找:寻找旋转排序数组中的最小值、点名
【LeetCode刷题】二分查找:寻找旋转排序数组中的最小值、点名