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 = 25F(1) = (0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) = 0 + 4 + 6 + 6 = 16F(2) = (0 * 2) + (1 * 6) + (2 * 4) + (3 * 3) = 0 + 6 + 8 + 9 = 23F(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.length1 <= 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;
}
};