C语言
#define MAX_ONE(a,b) ((a)>(b)?(a):(b))
#define INT_MIN 0x80000000
int maxRotateFunction(int* nums, int numsSize){
int dp = 0;
int max = INT_MIN;
int sum = 0;
int k;
int i;
for (i = 0; i < numsSize; i++) {
dp+=(i * nums[i]);
sum += nums[i];
}
max = MAX_ONE(max, dp);
for (k = 1; k < numsSize; k++) {
dp = dp + sum - numsSize * nums[numsSize - k];
max = MAX_ONE(max, dp);
}
return max;
}
注意点
- 数学归纳找出
F(k)
与F(k-1)
的关系为 F(k)=F(k-1)+sum(nums[:])-numsSize*nums[numsSize-k]
- 注意
max
的初始化应该为INT_MIN
即0x80000000
来满足负数的情况; - 重复计算
sum
会导致超时,所以需要抽出来只做一次的运算; dp
代替dp[]
优化空间;
结果
题目