Rotate Function

medium array math dp

Problem

Define F(k) = 0·Bk[0] + 1·Bk[1] + … + (n−1)·Bk[n−1] where Bk is nums rotated k positions clockwise. Return the maximum F(k) over k = 0, 1, …, n−1.

Inputnums = [4, 3, 2, 6]
Output26
F(3) = 0·6 + 1·4 + 2·3 + 3·2 = … key recurrence: F(k) = F(k−1) + sum − n·nums[n−k].

def max_rotate_function(nums):
    n, total = len(nums), sum(nums)
    f = sum(i * v for i, v in enumerate(nums))
    best = f
    for k in range(1, n):
        f = f + total - n * nums[n - k]
        best = max(best, f)
    return best
function maxRotateFunction(nums) {
  const n = nums.length;
  const total = nums.reduce((a, b) => a + b, 0);
  let f = 0;
  for (let i = 0; i < n; i++) f += i * nums[i];
  let best = f;
  for (let k = 1; k < n; k++) {
    f = f + total - n * nums[n - k];
    best = Math.max(best, f);
  }
  return best;
}
class Solution {
    public int maxRotateFunction(int[] nums) {
        int n = nums.length, total = 0, f = 0;
        for (int i = 0; i < n; i++) { total += nums[i]; f += i * nums[i]; }
        int best = f;
        for (int k = 1; k < n; k++) {
            f = f + total - n * nums[n - k];
            best = Math.max(best, f);
        }
        return best;
    }
}
int maxRotateFunction(vector<int>& nums) {
    int n = nums.size(), total = 0, f = 0;
    for (int i = 0; i < n; i++) { total += nums[i]; f += i * nums[i]; }
    int best = f;
    for (int k = 1; k < n; k++) {
        f = f + total - n * nums[n - k];
        best = max(best, f);
    }
    return best;
}
Time: O(n) Space: O(1)