LeetCode : Rotate Function

本文介绍了一种针对数组旋转后元素与其下标乘积之和的最大值问题的高效求解算法。通过发现不同旋转状态之间的递推关系,避免了直接计算所带来的超时问题。文章给出了具体的实现代码,并通过加入预判条件进一步提升了算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先尝试直接计算,记录最大值,会超时。

思路

通过观察

f(0)=0×A[0]+1×A[1]+2×A[2]+3×A[3].
f(1)=1×A[0]+2×A[1]+3×A[2]+0×A[3].
f(2)=2×A[0]+3×A[1]+0×A[2]+1×A[3].
f(3)=3×A[0]+0×A[1]+1×A[2]+2×A[3].

发现function之间有递归关系

f(1)=f(0)+sum4×A[3].
f(2)=f(1)+sum4×A[2].
f(3)=f(2)+sum4×A[1].

Solution

int maxRotateFunction(vector<int>& A)
{
    int k = A.size();
    int sum = 0; // A中所有元素和
    int res = 0; // 结果:记录最大值
    int temp = 0; // function(i)

    for(int i = 0; i < k; i++)
    {
        sum += A[i];
        temp += i * A[i];
    }

    res = temp;

    for(int i = 1; i < k; i++)
    {
        temp = temp + sum - k * A[k - i % k];
        if(temp > res)
            res = temp;
    }

    return res;
}

Tip

前面加一些判断条件,明显减少了最后判定的时间。

if(k == 1)
    return 0;
else if(k == 2)
    return max(A[0], A[1]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值