暴力超时:时间复杂度 O(n^2)
1 class Solution { 2 public int maxRotateFunction(int[] A) { 3 if(A.length==0) return 0; 4 int n=A.length; 5 int res=Integer.MIN_VALUE; 6 for(int s=0;s<n;s++){ 7 int temp=0; 8 for(int i=0;i<n;i++){ 9 temp+=i*A[(s+i)%n]; 10 } 11 res=Math.max(res,temp); 12 } 13 return res; 14 } 15 }
优化:记录一个数组和sum,初始的F(0)情况,减去一个sum,然后再加上n个A[0]值,这样得到的结果就是下一个F[1]....接下来同理。
1 class Solution { 2 public int maxRotateFunction(int[] A) { 3 if(A.length==0) return 0; 4 int n=A.length; 5 int sum=0,F=0; 6 for(int i=0;i<n;i++){ //遍历求和 7 sum+=A[i]; 8 F+=i*A[i]; 9 } 10 int res=F; //返回值 11 for(int i=0;i<n;i++){ //迭代求取下一个和 12 F-=sum; 13 F+=n*A[i]; 14 res=Math.max(res,F); 15 } 16 return res; 17 } 18 }