Maximum sum of i*arr[i] among all rotations of a given array - GeeksforGeeks
Given an array arr[] of n integers, find the maximum that maximizes sum of value of i*arr[i] where i varies from 0 to n-1.
A simple solution is to try all possible rotations. Compute sum of i*arr[i] for every rotation and return maximum sum.
The idea is to compute value of a rotation using value of previous rotation. When we rotate an array by one, following changes happen in sum of i*arr[i].
1) Multiplier of arr[i-1] changes from 0 to n-1, i.e., arr[i-1] * (n-1) is added to current value.
2) Multipliers of other terms is decremented by 1. i.e., (cum_sum – arr[i-1]) is subtracted from current value where cum_sum is sum of all numbers.
Read full article from Maximum sum of i*arr[i] among all rotations of a given array - GeeksforGeeks
Given an array arr[] of n integers, find the maximum that maximizes sum of value of i*arr[i] where i varies from 0 to n-1.
A simple solution is to try all possible rotations. Compute sum of i*arr[i] for every rotation and return maximum sum.
int maxSum(int arr[], int n){ // Initialize result int res = INT_MIN; // Consider rotation beginning with i // for all possible values of i. for (int i=0; i<n; i++) { // Initialize sum of current rotation int curr_sum = 0; // Compute sum of all values. We don't // acutally rotation the array, but compute // sum by finding ndexes when arr[i] is // first element for (int j=0; j<n; j++) { int index = (i+j)%n; curr_sum += j*arr[index]; } // Update result if required res = max(res, curr_sum); } return res;}The idea is to compute value of a rotation using value of previous rotation. When we rotate an array by one, following changes happen in sum of i*arr[i].
1) Multiplier of arr[i-1] changes from 0 to n-1, i.e., arr[i-1] * (n-1) is added to current value.
2) Multipliers of other terms is decremented by 1. i.e., (cum_sum – arr[i-1]) is subtracted from current value where cum_sum is sum of all numbers.
next_val = curr_val - (cum_sum - arr[i-1]) + arr[i-1] * (n-1);
next_val = Value of ∑i*arr[i] after one rotation.
curr_val = Current value of ∑i*arr[i]
cum_sum = Sum of all array elements, i.e., ∑arr[i].
Lets take example {1, 2, 3}. Current value is 1*0+2*1+3*2
= 8. Shifting it by one will make it {2, 3, 1} and next value
will be 8 - (6 - 1) + 1*2 = 5 which is same as 2*0 + 3*1 + 1*2
int maxSum(int arr[], int n){ // Compute sum of all array elements int cum_sum = 0; for (int i=0; i<n; i++) cum_sum += arr[i]; // Compute sum of i*arr[i] for initial // configuration. int curr_val = 0; for (int i=0; i<n; i++) curr_val += i*arr[i]; // Initialize result int res = curr_val; // Compute values for other iterations for (int i=1; i<n; i++) { // Compute next value using previous value in // O(1) time int next_val = curr_val - (cum_sum - arr[i-1]) + arr[i-1] * (n-1); // Update current value curr_val = next_val; // Update result if required res = max(res, next_val); } return res;}