396.Rotate Function(M)

本文介绍了一种高效算法来解决寻找给定数组经过不同次数循环右移后所得旋转函数最大值的问题。通过分析旋转函数间的关系,减少计算量,实现快速求解。

题目描述

给定一个数组A,n是它的长度。假定Bk为将数组A循环右移k位后的结果。我们定义一个 旋转函数F,如下:
这里写图片描述
求F(0),F(1),…,F(n-1)中的最大值
原题以及例子如下,
这里写图片描述
如果没有时间的限制,那么这道题可以很容易的使用暴力求解法。可惜并不能。那么这个时候就要观察了,既然不能暴力求解,那么F(k)之间肯定会存在一种联系。这里有个很巧妙的地方,如下所示
Bk[i] = Bk-1[i -1](i != 0)
Bk[0] = Bk-1[n - 1]
由上面两个式子可以得到
F(k) = 0 * Bk-1[n-1] + 1 * Bk-1[0] + … + (n-1)Bk-1[n-2]
F(k-1) = 0 * Bk-1[0] + 1 * Bk-1[1] + … + (n-1)Bk-1[n-1]
F(k) - F(k-1) = Bk-1[0] + Bk-1[1] + … + Bk-1[n-2] + Bk-1[n-1] - n*Bk-1[n-1]
很明显,前面的n项为数组A中所有元素之和,很容易就得到了F(k)与F(k-1)之间的关系,减少了很大的计算量。这种题代码量一般都不大,主要是能观察出他们之间的关系。之后慢慢计算就好了,具体代码如下,

class Solution {
public:
    int maxRotateFunction(vector<int>& A) {
       int sum = 0, temp = 0;
       int size = A.size();
       for (int i = 0; i < size; ++i) {
           sum += A[i];
           temp += i * A[i];
        }
        int max = temp;
        for (int i = 1; i < size; ++i) {
            int pos = size - i;
            temp = sum + temp - size  * A[pos];
            max = max > temp ? max : temp;
        }
        return max;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值