給定一個長度爲 n 的整數數組 A 。 數組
假設 Bk 是數組 A 順時針旋轉 k 個位置後的數組,咱們定義 A 的"旋轉函數" F 爲: ide
F(k) = 0 * Bk[0] + 1 * Bk[1] + ... + (n-1) * Bk[n-1]。 函數
計算F(0), F(1), ..., F(n-1)中的最大值。 spa
注意:
能夠認爲 n 的值小於 105。 it
示例: io
A = [4, 3, 2, 6] class
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 di
F(2) = (0 * 2) + (1 * 6) + (2 * 4) + (3 * 3) = 0 + 6 + 8 + 9 = 23 view
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 。
解題思想
其實就是給了一個數組A,和一個方程,方程簡單來講就是全部 第i位(從0開始)的值A[i]乘上i的積的和。如今容許你把數字循環位移(全部位置均可以,保證相對位置不變),找出取值最大的那一個。
其實方程的計算不難,這題是關鍵如何計算不一樣循環位移的值(確定不能每次都直接計算)。
這裏的方式很簡單,由於都是向右循環位移,那麼除了當前數組的最後一個位置,所有都多了一個,而最後一個少了n-1個(從n-1的係數變成0)。
那麼咱們改變下,假設如今方程值是f,A的全部值的和是sa
那麼一次向右循環位移能夠認爲
一、首先全部值都加一個自身,也就是和加上sa
二、扣除1中多加的最後一個,以及原來就應該減掉的n個了,減掉A[n-i]*n就好
找到上面每一個當中取值最大的就能夠
1 public class Solution { 2 public int maxRotateFunction(int[] A) { 3 int n = A.length; 4 //假設不旋轉下的f0的值 5 int f0 = 0; 6 // 當順序位移一位後,拋出變成0的那個,那麼總體增長的 7 int sumOfA = 0; 8 for(int i=0;i<n;i++){ 9 f0 += A[i] * i; 10 sumOfA += A[i]; 11 } 12 int max = f0; 13 int fi = f0; //開始考慮旋轉的 14 for(int i=1;i<n;i++){ 15 //旋轉後,全部加1 16 fi += sumOfA; 17 //上一回合的 最後一個須要減去n個(原來n-1 剛剛又加了一個) 18 fi -= n * A[ n -i ]; 19 max = Math.max(max,fi); 20 } 21 return max; 22 } 23 }