O(n^2) approach:
public class Solution {
public int maxRotateFunction(int[] A) {
if(A == null || A.length == 0){
return 0;
}
int max = Integer.MIN_VALUE;
int[] temp = new int[A.length*2];
for(int i=0; i<A.length; i++){
temp[i] = A[i];
temp[A.length+i] = A[i];
}
for(int i=A.length; i>0; i--){
int curRes = 0;
for(int j=i; j<i+A.length; j++){
curRes += temp[j]*(j-i);
}
max = Math.max(max, curRes);
}
return max;
}
}
O(n) approach: each time rotating to the right by one element, F(i) = F(i-1) + sum of the array - n*(last element of i-1 array)
public class Solution {
public int maxRotateFunction(int[] A) {
if(A == null || A.length == 0){
return 0;
}
int n = A.length;
int sumOfA = 0;
int f0 = 0;
for(int i=0; i<n; i++){
sumOfA += A[i];
f0 += i*A[i];
}
int max = f0;
int fi = f0;
for(int i=1; i<n; i++){
fi = fi + sumOfA - n*A[n-i];
max = Math.max(max, fi);
}
return max;
}
}