# Maximize sum of product and difference between any pair of array elements possible

• Difficulty Level : Expert
• Last Updated : 10 Jun, 2021

Given an array arr[] of size N, the task is to find the maximum value of arr[i] ∗ arr[j] + arr[i] − arr[j] for any pair (arr[i], arr[j]) from the given array, where i != j and 0 < i, j < N – 1.

Examples:

Input: arr[] = {1, 2, 3, 4, 5}
Output: 21
Explanation:
Among all the pairs of the array, the maximum value is obtained for the pair (arr[4], arr[3]), which is equal to
=> arr[4] * arr[3] + arr[4] – arr[3] = 5 * 4 + 5 – 4 = 20 + 1 = 21.

Input: {-4, -5, 0, 1, 3}
Output: 21
Explanation:
Among all the pairs of the array, the maximum value is obtained for the pair (arr[0], arr[1]), which is equal to
=> arr[0] * arr[1] + arr[0] – arr[1] = (-4) * (-5) + (-4) – (-5) = 20 + 1 = 21.

Naive Approach: The simplest approach to solve the problem is to traverse the array and generate all possible pairs (arr[i], arr[j]) (i != j) from the array and evaluate the expression for all the pairs. Finally, print the maximum of all the pairs.
Time Complexity: O(N2)
Auxiliary Space: O(1)

Efficient Approach: The optimal idea is based on the observation that the value of the expression can be maximum for the following 2 cases:

Follow the steps below to solve the problem:

• Sort the array arr[] in ascending order.
• Evaluate the expression for the pair arr[N – 1] and arr[N – 2] and store it in a variable, say max1.
• Similarly, evaluate the expression for the pair arr[1] and arr[0] and store it in a variable, say max2.
• Store the maximum of max1 and max2 in a variable, say ans.
• Print the value of ans as the result.

Below is the implementation of the above approach:

## C++

 // C++ program for the above approach#include using namespace std; // Function to evaluate given expressionint compute(int a, int b){    // Store the result    int ans = a * b + a - b;    return ans;} // Function to find the maximum value of// the given expression possible for any// unique pair from the given arrayvoid findMaxValue(int arr[], int N){    // Sort the array in ascending order    sort(arr, arr + N);     // Evaluate the expression for    // the two largest elements    int maxm = compute(arr[N - 1], arr[N - 2]);     // Evaluate the expression for    // the two smallest elements    maxm = max(maxm, compute(arr[1], arr[0]));     // Print the maximum    cout << maxm;} // Driver Codeint main(){    // Given array    int arr[] = { -4, -5, 0, 1, 3 };     // Store the size of the array    int N = sizeof(arr) / sizeof(arr[0]);     findMaxValue(arr, N);     return 0;}

## Java

 // Java program for the above approachimport java.io.*;import java.util.*;class GFG{   // Function to evaluate given expression  static int compute(int a, int b)  {    // Store the result    int ans = a * b + a - b;    return ans;  }   // Function to find the maximum value of  // the given expression possible for any  // unique pair from the given array  static void findMaxValue(int arr[], int N)  {    // Sort the array in ascending order    Arrays.sort(arr);     // Evaluate the expression for    // the two largest elements    int maxm = compute(arr[N - 1], arr[N - 2]);     // Evaluate the expression for    // the two smallest elements    maxm = Math.max(maxm, compute(arr[1], arr[0]));     // Print the maximum    System.out.print(maxm);  }    // Driver Code  public static void main(String[] args)  {    // Given array    int arr[] = { -4, -5, 0, 1, 3 };     // Store the size of the array    int N = arr.length;     findMaxValue(arr, N);  }} // This code is contributed by saanjoy_62

## Python3

 # Python Program for the above approach# Function to evaluate given expressiondef compute(a, b):       # Store the result    res = (a * b) + (a - b)    return res   # Function to find the maximum value of# the given expression possible for any# unique pair from the given arraydef findMaxValue(arr, N):       # Sort the list in ascending order    arr.sort()         # Evaluate the expression for    # the two largest elements    maxm = compute(arr[N - 1], arr[N - 2])         # Evaluate the expression for    # the two smallest elements    maxm = max(maxm, compute(arr[1], arr[0]));    print(maxm)     # Driver code# given listarr = [-4, -5, 0, 1, 3] # store the size of the listN = len(arr)findMaxValue(arr, N) # This code is contributed by santhoshcharan.

## C#

 // C# program for above approachusing System;public class GFG{   // Function to evaluate given expression  static int compute(int a, int b)  {    // Store the result    int ans = a * b + a - b;    return ans;  }    // Function to find the maximum value of  // the given expression possible for any  // unique pair from the given array  static void findMaxValue(int[] arr, int N)  {    // Sort the array in ascending order    Array.Sort(arr);      // Evaluate the expression for    // the two largest elements    int maxm = compute(arr[N - 1], arr[N - 2]);      // Evaluate the expression for    // the two smallest elements    maxm = Math.Max(maxm, compute(arr[1], arr[0]));      // Print the maximum    Console.WriteLine(maxm);  } // Driver codepublic static void Main(String[] args){     // Given array    int[] arr = { -4, -5, 0, 1, 3 };      // Store the size of the array    int N = arr.Length;      findMaxValue(arr, N);}} // This code is contributed by susmitakundugoaldanga.

## Javascript



Output

21

Time Complexity: O(N*log(N))
Auxiliary Space: O(1)

My Personal Notes arrow_drop_up