给定一个长度为 n 的整数数组 A 。
计算F(0), F(1), ..., F(n-1)中的最大值。
A = [4, 3, 2, 6]
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 。
/**
* 把数组逆转跟把乘数逆转是一样的,可以看出有如下规律
* 4 3 2 6
*
* 0*4 1*3 2*2 3*6 F(0)
*
* 3*4 0*3 1*2 2*6 F(1) = F(0) - SUM(data) + N * data[0];
*
* 2*4 3*3 0*2 1*6 F(2) = F(1) - SUM(data) + N * data[1];
*
* 1*4 2*3 3*2 0*6 F(3) = F(2) - SUM(data) + N * data[2];
*
*/
规律题:
可得
F(n)=F(n-1)+sum-n*nums[n-i];
class Solution {
public int maxRotateFunction(int[] nums) {
int sum=0,f=0;//注意防止大数,所以用long
for(int i=0;i<nums.length;i++){
sum+=nums[i];
f+=i*nums[i];
}
int max=f;
for(int i=1;i<nums.length;i++){
f=f+sum-nums.length*nums[nums.length-i];
max=Math.max(max,f);
}
return max;
}
}