Leetcode 396.旋轉函數

旋轉函數

給定一個長度爲 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 }
相關文章
相關標籤/搜索