396. Rotate Function

Compute F(0) from scratch, then derive every subsequent rotation value in O(1) using the total array sum.

Problem statement

You are given an integer array nums of length n.

Assume arrk to be an array obtained by rotating nums by k positions clockwise. We define the rotation function F on nums as follows:

F(k) = 0 * arrk[0] + 1 * arrk[1] + ... + (n - 1) * arrk[n - 1]

Return the maximum value of F(0), F(1), ..., F(n - 1).

The test cases are generated so that the answer fits in a 32-bit integer.

Examples

Example 1

Input: nums = [4,3,2,6]
Output: 26

Explanation:

  • 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
  • F(2) = (0 * 2) + (1 * 6) + (2 * 4) + (3 * 3) = 0 + 6 + 8 + 9 = 23
  • F(3) = (0 * 3) + (1 * 2) + (2 * 6) + (3 * 4) = 0 + 2 + 12 + 12 = 26

So the maximum value of F(0), F(1), F(2), F(3) is F(3) = 26.

Example 2

Input: nums = [100]
Output: 0

Constraints

  • n == nums.length
  • 1 <= n <= 10^5
  • -100 <= nums[i] <= 100

Explanation

Simulating each rotation step by step is the easiest way to understand this problem.

First, calculate F(0):

F(0) = 0*a[0] + 1*a[1] + 2*a[2] + ... + (n-1)*a[n-1]

For the next rotation, the last element moves to the front and everything else shifts right by one:

F(1) = 0*a[n-1] + 1*a[0] + 2*a[1] + ... + (n-1)*a[n-2]
F(2) = 0*a[n-2] + 1*a[n-1] + 2*a[0] + ... + (n-1)*a[n-3]

Here’s the key insight: when we rotate, the element at position i (from the end) becomes the first element, so its contribution drops to 0. All other elements now contribute +1 more than before because their positions increased by 1.

So the change from one rotation to the next is:

  • We lose n * a[i] (the element that moved to position 0)
  • We gain sum (every other element adds 1 more)

This gives us the recurrence:

F = F + sum - n * a[i]

Just store the total sum of the array, then iterate backwards updating F using this formula. Keep track of the maximum F you see.

Time: O(n) — one pass to compute sum and F(0), one pass for rotations
Space: O(1) — just a few variables

Simulation

Code

#define ll long long

class Solution {
public:
    int maxRotateFunction(vector<int>& nums) {
        ll ans = INT_MIN, sum = 0, F = 0, n = nums.size();

        for (int i = 0; i < n; i++) {
            sum += nums[i];
            F += i * nums[i];
        }

        for (int i = n - 1; i >= 0; i--) {
            int rem = n * nums[i];
            F = F + sum - rem;
            ans = max<ll>(ans, F);
        }

        return ans;
    }
};

Resources