給定一個(gè)長度為 n 的整數(shù)數(shù)組 nums 耳峦。
假設(shè) arrk 是數(shù)組 nums 順時(shí)針旋轉(zhuǎn) k 個(gè)位置后的數(shù)組抛人,我們定義 nums 的 旋轉(zhuǎn)函數(shù) F 為:
F(k) = 0 * arrk[0] + 1 * arrk[1] + ... + (n - 1) * arrk[n - 1]
返回 F(0), F(1), ..., F(n-1)中的最大值 躲胳。
生成的測試用例讓答案符合 32 位 整數(shù)贩虾。
示例 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 <= 10^5
-100 <= nums[i] <= 100
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/rotate-function
這個(gè)題是一個(gè)比較簡單的題,因?yàn)樽罱⒌膸讉€(gè)題都是用遞歸的方法,所以看的第一眼,我就想著遞歸谢澈,但遞歸出現(xiàn)一個(gè)問題,就是當(dāng)數(shù)組長度太長的時(shí)候御板,會(huì)報(bào)錯(cuò)锥忿。
于是只能換個(gè)方法,找規(guī)律怠肋。
就那用例一來說吧敬鬓。
f0 = 0a[0] + 1a[1] + 2a[2] + 3a[3];
f1 = 0a[3] + 1a[0] + 2a[1] + 3a[2];
f2 = 0a[2] + 1a[3] + 2a[0] + 3a[1];
f4 = 0a[1] + 1a[2] + 2a[3] + 3a[0];
f1 - f0 = a[0] + a[1] + a[2] - 3a[3];
f2 - f1 = a[3] + a[0] + a[1] - 3a[2];
f3 - f1 = a[2] + a[3] + a[0] - 3*a[1];
設(shè) sum = a[0] + a[1] + a[2] + a[3];
f1 - f0 = sum - 4a[3]; 即 f1 = sum + f0 - 4a[3];
f2 - f1 = sum - 4a[2]; 即 f2 = sum + f1 - 4a[2];
f3 - f2 = sum - 4a[1]; 即 f3 = sum + f2 - 4a[1];
所以,只要求出第一次乘積和就能得出后續(xù)的值笙各。
那么钉答,上代碼:
var maxRotateFunction = function(nums) { var maxSum = 0,sum = 0,sum1 = 0,len = nums.length; for(var i = 0; i < len; i++){ sum += i * nums[i]; sum1 += nums[i]; } maxSum = sum; for(var i = len-1; i > 0; i--){ sum = sum + sum1 - len * nums[i]; maxSum = maxSum < sum ? sum : maxSum; } return maxSum; };