首页 > 其他分享 >力扣-396. 旋转函数

力扣-396. 旋转函数

时间:2024-04-24 23:33:15浏览次数:27  
标签:... candidate nums int long 旋转 力扣 396 ans

1.题目介绍

题目地址(396. 旋转函数 - 力扣(LeetCode))

https://leetcode.cn/problems/rotate-function/

题目描述

给定一个长度为 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 <= 105
  • -100 <= nums[i] <= 100

2.题解

2.1 枚举

思路

很简单,把所有可能f(n)值算出来比较即可
但最终测试会爆内存,研究了一下,使用了vector arr, 发现是每次都会复制数组导致爆内存,而且函数的调用涉及到了栈的建立与恢复,十分消耗时间
所以我们选择直接将代码写在主函数main中即可

代码

  • 语言支持:C++

C++ Code:

错误代码如下:


class Solution {
public:
    long long cal_ans(vector<int> arr, int k){
        long long ans = 0;
        int n = arr.size();
        for(int i = 0; i < n; i++){
            ans += i * arr[(i + k) % n];
        }
        return ans;
    }

    int maxRotateFunction(vector<int>& nums) {
        long long ans = LONG_MIN;
        int n = nums.size() - 1;
        for(int i = 0; i <= n; i++){
            ans = max(ans, cal_ans(nums, i));
        }
        return ans;
    }
};

正确代码

class Solution {
public:
    long long maxRotateFunction(vector<int>& nums) {
        long long sum = 0;
        long long candidate = 0;
        int n = nums.size();
        for (int i = 0; i < n; ++i) {
            sum += nums[i];
            candidate += i * nums[i];
        }
        long long maxSum = candidate;
        for (int i = 1; i < n; ++i) {
            candidate = candidate + sum - n * nums[n - i];
            maxSum = max(maxSum, candidate);
        }
        return maxSum;
    }
};

复杂度分析

令 n 为数组长度。

  • 时间复杂度:\(O(n)\)
  • 空间复杂度:\(O(n)\)

2.2 迭代

思路

探索相邻式子之间的规律, 找到递归规律
F(0) = 0 * nums[0] + 1 * nums[1] + ... + (n-2) * nums[n-2] + (n-1) * nums[n-1];
F(1) = 1 * nums[0] + 2 * nums[1] + ... + (n-1) * nums[n-1] + 0 * nums[n] = F(0) + (nums[0] + nums[1] + nums[2] + ... + nums[n-1]) - n * nums[n-1];
规律如下:
F(1) - F(0) = totalSum - n * nums[n-1];
F(2) - F(1) = totalSum - n * nums[n-2];
...

代码

class Solution {
public:
    int maxRotateFunction(vector<int>& nums) {
        long long totalSum = 0, fn = 0;
        int n = nums.size();
        for(int i = 0; i < n; i++){
            totalSum += nums[i];
            fn += i * nums[i];
        }

        long long ans =  fn; 
        for(int i = 1; i <= n; i++){
            fn += totalSum - n * nums[n - i];
            ans = max(ans, fn);
        }
        return ans;
    }
};

标签:...,candidate,nums,int,long,旋转,力扣,396,ans
From: https://www.cnblogs.com/trmbh12/p/18156617

相关文章

  • 力扣-189. 轮转数组
    1.题目题目地址(189.轮转数组-力扣(LeetCode))https://leetcode.cn/problems/rotate-array/题目描述给定一个整数数组nums,将数组中的元素向右轮转k 个位置,其中 k 是非负数。 示例1:输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步......
  • 力扣-414. 第三大的数
    1.题目题目地址(414.第三大的数-力扣(LeetCode))https://leetcode.cn/problems/third-maximum-number/题目描述给你一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。 示例1:输入:[3,2,1]输出:1解释:第三大的数是1。示例2:输入:[1,2]输出:2......
  • 力扣-495. 提莫攻击
    1.题目题目地址(495.提莫攻击-力扣(LeetCode))https://leetcode.cn/problems/teemo-attacking/题目描述在《英雄联盟》的世界中,有一个叫“提莫”的英雄。他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。当提莫攻击艾希,艾希的中毒状态正好持续 duration秒。正......
  • 力扣-665. 非递减数列
    1.题目题目地址(665.非递减数列-力扣(LeetCode))https://leetcode.cn/problems/non-decreasing-array/题目描述给你一个长度为 n 的整数数组 nums ,请你判断在最多改变 1个元素的情况下,该数组能否变成一个非递减数列。我们是这样定义一个非递减数列的: 对于数组中任......
  • 【每周例题】力扣 C++ 分割字符串
    分割字符串题目 题目分析1.先确定用容器存储,容器的存储结构如下图所示: 2.这个题目的话,第一反应应该是用到动态规划,下面是动态规划的模板:res=[]ans=[]defbacktrack(未探索区域,res,path):if未探索区域满足结束条件:res.add(ans)#深度拷贝......
  • 【每周例题】力扣 C++ 最小和分割
    最小和分割题目 题目分析1.num1 和 num2 中所有数字出现的次数之和等于 num 中所有数字出现的次数。即,num1与num2是从num中提取出来的,且不会重复提取同一个数字,且提取的顺序并不需要按照num的数字顺序2.返回 num1 和 num2 可以得到的和的最小值。要想得到最小值,需......
  • Qt 从 QTransform 逆向解出 Translate/Scale/Rotate(平移/缩放/旋转)分析
    QTransform用于图形绘制,它定义了如何平移(translate)、缩放(scale)、切变(shear)、旋转(rotate)或投射(project)坐标系。注意:QTransform是作用于坐标系,不是直接作用于图形。实际运用中我们可以通过QPainter、QGraphicsView、QGraphicsItem实现图形的平移、缩放、旋转等操作,但是需要从......
  • 力扣周赛394之别样DP + 别样Dijkstra
    别样DP题目链接https://leetcode.cn/problems/minimum-number-of-operations-to-satisfy-conditions/description/题目大意题目思路需要考虑m列每一列填什么的情况,因为最终每一列都是一样的考虑暴力,每一列都可以变成0-9有\(10^m\)次种情况,这必然是不可行的我们从前往......
  • threejs - 渲染第一个3D场景 - 旋转的正方体
    1.安装threejs&使用2.创建三要素 场景scene相机camera渲染器render 3.场景newTHREE.Scene()  相机分为2种 1.透视相机2.正交相机 渲染器的使用 把canvas标签渲染到body页面document.body.appendChild(renderer.doLement); // 渲染canvasre......
  • Games101:绕任意轴旋转
    Overview对于任意坐标\(S_1=(S_x,S_y,S_z)^T\),绕任意轴线\(\vec{n}=(n_x,n_y,n_z)^T\)旋转\(\alpha\)度,推导变换矩阵\(R(\vec{n},\alpha)\),使得变换后的坐标\(S_2=R(\vec{n},\alpha)\cdotS_1\)本文使用向量运算,推导该变换矩阵。注意:轴线经过坐标系原点基本公式以列向量表......