leetcode每日一题 396. 旋转函数
1.暴力破解 超时
class Solution {
public int maxRotateFunction(int[] nums) {
if(nums.length == 1){
return 0;
}
int max = Integer.MIN_VALUE;
for (int i = 0; i < nums.length; i++) {
int sum = 0 ;
for (int j = 0; j < nums.length; j++) {
sum+= (i+j)%nums.length*nums[j];
}
max = Math.max(sum,max);
}
return max;
}
}
2.转公式 F(k) = f(k-1) + sum - n*nums[n-k] n=nums.length
class Solution {
public int maxRotateFunction(int[] nums) {
int max;
int sum = Arrays.stream(nums).sum();
//f(0)
int f = 0;
for (int i = 0; i < nums.length; i++) {
f += i*nums[i];
}
max = f;
//f(k) = f(k-1)+sum-n*nums[n-k]
for (int i = 1; i < nums.length; i++) {
f += sum - nums.length * nums[nums.length - i];
max = Math.max(max,f);
}
return max;
}
}

class Solution {
public int maxRotateFunction(int[] nums) {
int max;
int sum = 0;
//f(0)
int f = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
f += i*nums[i];
}
max = f;
//f(k) = f(k-1)+sum-n*nums[n-k]
for (int i = 1; i < nums.length; i++) {
f += sum - nums.length * nums[nums.length - i];
max = Math.max(max,f);
}
return max;
}
}


浙公网安备 33010602011771号