# 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:

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

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, arr), which is equal to
=> arr * arr + arr – arr = 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, arr), which is equal to
=> arr * arr + arr – arr = (-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 and arr 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 expression``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``void` `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, arr));` `    ``// Print the maximum``    ``cout << maxm;``}` `// Driver Code``int` `main()``{``    ``// Given array``    ``int` `arr[] = { -4, -5, 0, 1, 3 };` `    ``// Store the size of the array``    ``int` `N = ``sizeof``(arr) / ``sizeof``(arr);` `    ``findMaxValue(arr, N);` `    ``return` `0;``}`

## Java

 `// Java program for the above approach``import` `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 expression``def` `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 array``def` `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 list``arr ``=` `[``-``4``, ``-``5``, ``0``, ``1``, ``3``]` `# store the size of the list``N ``=` `len``(arr)``findMaxValue(arr, N)` `# This code is contributed by santhoshcharan.`

## C#

 `// C# program for above approach``using` `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, arr));`` ` `    ``// Print the maximum``    ``Console.WriteLine(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 susmitakundugoaldanga.`

## Javascript

 ``
Output
`21`

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

My Personal Notes arrow_drop_up