栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Leetcode--Java--396. 旋转函数

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Leetcode--Java--396. 旋转函数

题目描述

给定一个长度为 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. 仔细看任意相邻两组之前如何变化的,除了最后一个位置的数,其余位置都是系数加上1。因此可以依据这个特性递推。
  2. 系数加1,可以转化为再加一次所有的数,就是总和sum,然后再减去最后一个位置原始系数加上加1的系数,总系数就是n
  3. 不断递推最后一个位置删除的情况,在其中维护最大值即可
代码
class Solution {
    public int maxRotateFunction(int[] nums) {
        int res = 0, sum = 0, curF = 0;
        int n = nums.length;
        for (int i = 0; i < n; i ++ ) {
            sum += nums[i];
            //初始F函数
            curF += i * nums[i];
        }
        res = curF;
        //动态维护,移动一次相当于,除了最后一个位置,前面乘的系数加一即加上原始sum,然后减去最后一个数原本的系数加上新的,就是n的系数
        for (int i = n - 1; i >= 0; i -- ) {
            curF += sum - n * nums[i];
            res = Math.max(res, curF);
        }
        return res;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/825733.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号