Array formed using sum of absolute differences of that element with all other elements

• Last Updated : 18 May, 2021

Given a sorted array arr[] of N distinct positive integers. The task is to generate an array such that the element at each index in the new array is the sum of absolute differences of the corresponding element with all other elements of the given array.

Input: arr[] = [2, 3, 5]
Output: [4, 3, 5]
Explanation:
distance(2) = |2 – 3| + |2 – 5| = 4
distance(3) = |3 – 2| + |3 – 5| = 3
distance(5) = |5 – 2| + |5 – 3| = 5
Therefore, we will return [4, 3, 5]

Input:  arr[] = [2, 3, 5, 6]
Output:  [8, 6, 6, 8]
Explanation:
distance(2) = |2 – 3| + |2 – 5| + |2 – 6|= 8
distance(3) = |3 – 2| + |3 – 5| + |3 – 6|= 6
distance(5) = |5 – 2| + |5 – 3| + |5 – 6|= 6
distance(6) = |6 – 2| + |6 – 3| + |6 – 5|= 8
Therefore, we will return [8, 6, 6, 8]

Naive Approach: The idea is to generate all possible pairs for each element in the array arr[] and add the summation of the absolute difference of the pairs for each element in the new array. Print the array after the above steps for all the elements.

Below is the implementation of the above approach:

C++

 `// C++ program for the above approach``#include ``using` `namespace` `std;` `// Function to return the new array``vector<``int``> calculate(``int``* arr, ``int` `n)``{``    ` `    ``// Initialize the Arraylist``    ``vector<``int``> ans;` `    ``// Sum of absolute differences``    ``// of element with all elements``    ``for``(``int` `i = 0; i < n; i++)``    ``{``        ` `        ``// Initialize int sum to 0``        ``int` `sum = 0;` `        ``for``(``int` `j = 0; j < n; j++)``        ``{``            ``sum += ``abs``(arr[i] - arr[j]);``        ``}` `        ``// Add the value of sum to ans``        ``ans.push_back(sum);``    ``}` `    ``// Return the final ans``    ``return` `ans;``}` `// Driver Code``int` `main()``{``    ` `    ``// Given array arr[]``    ``int` `arr[] = { 2, 3, 5, 6 };``    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr[0]);``    ` `    ``// Function call``    ``vector<``int``> ans = calculate(arr, n);``    ` `    ``cout << ``"["``;``    ``for``(``auto` `itr : ans)``        ``cout << itr << ``", "``;``        ` `    ``cout << ``"]"``;``    ` `    ``return` `0;``}``// This code is contributed by jrishabh99`

Java

 `// Java program for the above approach``import` `java.util.*;` `class` `GFG {` `    ``// Function to return the new array``    ``private` `static` `List``    ``calculate(``int``[] arr)``    ``{``        ``// Length of the arraylist``        ``int` `n = arr.length;` `        ``// Initialize the Arraylist``        ``List ans``            ``= ``new` `ArrayList();` `        ``// Sum of absolute differences``        ``// of element with all elements``        ``for` `(``int` `i = ``0``;``            ``i < arr.length; i++) {` `            ``// Initialize int sum to 0``            ``int` `sum = ``0``;` `            ``for` `(``int` `j = ``0``;``                ``j < arr.length; j++) {` `                ``sum += Math.abs(arr[i] - arr[j]);``            ``}` `            ``// Add the value of sum to ans``            ``ans.add(sum);``        ``}` `        ``// Return the final ans``        ``return` `ans;``    ``}` `    ``// Driver Code``    ``public` `static` `void``        ``main(String[] args)``    ``{``        ``// Given array arr[]``        ``int``[] arr = { ``2``, ``3``, ``5``, ``6` `};` `        ``// Function Call``        ``System.out.println(calculate(arr));``    ``}``}`

Python3

 `# Python3 program for the above approach` `# Function to return the new array``# private static List``def` `calculate(arr):` `    ``# Length of the arraylist``    ``n ``=` `len``(arr)` `    ``# Initialize the Arraylist``    ``ans ``=` `[]` `    ``# Sum of absolute differences``    ``# of element with all elements``    ``for` `i ``in` `range``(n):` `        ``# Initialize sum to 0``        ``sum` `=` `0` `        ``for` `j ``in` `range``(``len``(arr)):``            ``sum` `+``=` `abs``(arr[i] ``-` `arr[j])` `        ``# Add the value of sum to ans``        ``ans.append(``sum``)` `    ``# Return the final ans``    ``return` `ans` `# Driver Code``if` `__name__ ``=``=` `'__main__'``:` `    ``# Given array arr[]``    ``arr ``=` `[ ``2``, ``3``, ``5``, ``6` `]` `    ``# Function call``    ``print``(calculate(arr))` `# This code is contributed by mohit kumar 29`

C#

 `// C# program for the above approach``using` `System;``using` `System.Collections;``using` `System.Collections.Generic;` `class` `GFG{` `// Function to return the new array``private` `static` `List<``int``> calculate(``int``[] arr)``{``    ` `    ``// Length of the arraylist``    ``int` `n = arr.Length;` `    ``// Initialize the Arraylist``    ``List<``int``> ans = ``new` `List<``int``>();` `    ``// Sum of absolute differences``    ``// of element with all elements``    ``for``(``int` `i = 0; i < arr.Length; i++)``    ``{``        ` `        ``// Initialize int sum to 0``        ``int` `sum = 0;` `        ``for``(``int` `j = 0; j < arr.Length; j++)``        ``{``            ``sum += Math.Abs(arr[i] - arr[j]);``        ``}` `        ``// Add the value of sum to ans``        ``ans.Add(sum);``    ``}` `    ``// Return the final ans``    ``return` `ans;``}` `// Driver Code``public` `static` `void` `Main(``string``[] args)``{``    ` `    ``// Given array arr[]``    ``int``[] arr = { 2, 3, 5, 6 };` `    ``List<``int``> tmp = calculate(arr);``    ``Console.Write(``"["``);``    ``for``(``int` `i = 0; i < tmp.Count; i++)``    ``{``        ``if``(i != tmp.Count - 1)``        ``{``            ``Console.Write(tmp[i] + ``", "``);``        ``}``        ``else``        ``{``            ``Console.Write(tmp[i]);``        ``}``    ``}``    ``Console.Write(``"]"``);``}``}` `// This code is contributed by rutvik_56`

Javascript

 ``

Output:

`[8, 6, 6, 8]`

Time Complexity: O(N^2)
Auxiliary Space: O(N)

Efficient Approach: To optimize the above approach the idea is to keep track of the accumulated subtraction of the values to the left and of the sum of values to the right. The sum of the difference of all the pairs for each element is given by:

num_of_elements_to_the_left * current_value -num_of_elements_to_the_right * current_value

• Find the sum of all the elements in the given array(say sum).
• Initialize sub as 0.
• Traverse the given array and for each element do the following:
• Subtract the current value arr[i] from the sum.
• Add the difference of all the pairs for each element using the formula to the resultant array:
`sub + (i * arr[i]) - ((n - i - 1) * arr[i]) + sum`
• Subtract the current value arr[i] from the sum.
• Print the resultant array after the above steps.

Below is the implementation of the above approach:

C++

 `// C++ program for the``// above approach``#include ``using` `namespace` `std;` `// Function to return list of``// total Distance of each element``// from other elements in array``vector<``int``> calculate(``int` `arr[],``                      ``int` `n)``{``  ``int` `sub = 0;``  ``int` `sum = 0;` `  ``// Initialize the arraylist``  ``vector<``int``> ans;` `  ``// Keep track of the``  ``// accumulated of the``  ``// sum of values to right``  ``for` `(``int` `i = n - 1;``           ``i >= 0; i--)``    ``sum += arr[i];` `  ``// Keep track of the``  ``// accumulated subtraction``  ``// of the values to the left``  ``for` `(``int` `i = 0; i < n; i++)``  ``{``    ``sum -= arr[i];` `    ``// Add the value to the``    ``// resultant array ans[]``    ``ans.push_back(sub + (i * arr[i]) -``                 ``((n - i - 1) *``                   ``arr[i]) + sum);` `    ``sub -= arr[i];``  ``}``  ` `  ``// Return the final``  ``// answer``  ``return` `ans;``}` `// Driver Code``int` `main()``{``  ``// Initialize the array``  ``int` `arr[] = {2, 3, 5, 6};``  ``int` `n = ``sizeof``(arr) /``          ``sizeof``(arr[0]);``  ``vector<``int``> ans = (calculate(arr, n));``  ` `  ``for` `(``int` `i = 0; i < n; i++)``    ``cout << ans[i] << ``" "``;``}` `// This code is contributed by Chitranayal`

Java

 `// Java program for the above approach``import` `java.util.*;` `class` `GFG {` `    ``// Function to return list of``    ``// total Distance of each element``    ``// from other elements in array``    ``private` `static` `List``    ``calculate(``int``[] arr)``    ``{``        ``// Length of the array``        ``int` `n = arr.length;``        ``int` `sub = ``0``;``        ``int` `sum = ``0``;` `        ``// Initialize the arraylist``        ``List ans``            ``= ``new` `ArrayList();` `        ``// Keep track of the accumulated``        ``// of the sum of values to right``        ``for` `(``int` `i = n - ``1``; i >= ``0``; i--)``            ``sum += arr[i];` `        ``// Keep track of the accumulated``        ``// subtraction of the values to the left``        ``for` `(``int` `i = ``0``; i < arr.length; i++) {` `            ``sum -= arr[i];` `            ``// Add the value to the resultant``            ``// array ans[]``            ``ans.add(sub``                    ``+ (i * arr[i])``                    ``- ((n - i - ``1``)``                    ``* arr[i])``                    ``+ sum);` `            ``sub -= arr[i];``        ``}``        ``// return the final answer``        ``return` `ans;``    ``}` `    ``// Driver Code``    ``public` `static` `void``        ``main(String[] args)``    ``{``        ``// Initialize the array``        ``int``[] arr = { ``2``, ``3``, ``5``, ``6` `};` `        ``// Function Call``        ``System.out.println(calculate(arr));``    ``}``}`

Python3

 `# Python3 program for the above approach` `# Function to return list of``# total Distance of each element``# from other elements in array``def` `calculate (arr):` `    ``# Length of the array``    ``n ``=` `len``(arr)``    ``sub ``=` `0``    ``Sum` `=` `0` `    ``# Initialize the ArrayList``    ``ans ``=` `[]` `    ``# Keep track of the accumulated``    ``# of the sum of values to right``    ``for` `i ``in` `range``(n ``-` `1``, ``-``1``, ``-``1``):``        ``Sum` `+``=` `arr[i]` `    ``# Keep track of the accumulated``    ``# subtraction of values to left``    ``for` `i ``in` `range``(``len``(arr)):``        ``Sum` `-``=` `arr[i]` `        ``# Add the value to the resultant``        ``# array ans[]``        ``ans.append(sub ``+` `(i ``*` `arr[i]) ``-``               ``((n ``-` `i ``-` `1``) ``*` `arr[i]) ``+` `Sum``)` `        ``sub ``-``=` `arr[i]` `    ``# Return the final answer``    ``return` `ans` `# Driver Code``if` `__name__ ``=``=` `'__main__'``:``    ` `    ``# Initialize the array``    ``arr ``=` `[ ``2``, ``3``, ``5``, ``6` `]` `    ``# Function call``    ``print``(calculate(arr))` `# This code is contributed by himanshu77`

C#

 `// C# program for the above approach``using` `System;``using` `System.Collections.Generic;` `class` `GFG{` `// Function to return list of``// total Distance of each element``// from other elements in array``private` `static` `List<``int``> calculate(``int``[] arr)``{``    ` `    ``// Length of the array``    ``int` `n = arr.Length;``    ``int` `sub = 0;``    ``int` `sum = 0;` `    ``// Initialize the arraylist``    ``List<``int``> ans = ``new` `List<``int``>();` `    ``// Keep track of the accumulated``    ``// of the sum of values to right``    ``for``(``int` `i = n - 1; i >= 0; i--)``        ``sum += arr[i];` `    ``// Keep track of the accumulated``    ``// subtraction of the values to the left``    ``for``(``int` `i = 0; i < arr.Length; i++)``    ``{``        ``sum -= arr[i];` `        ``// Add the value to the resultant``        ``// array ans[]``        ``ans.Add(sub + (i * arr[i]) -``                 ``((n - i - 1) *``                 ``arr[i]) + sum);` `        ``sub -= arr[i];``    ``}``    ` `    ``// return the readonly answer``    ``return` `ans;``}` `// Driver Code``public` `static` `void` `Main(String[] args)``{``    ` `    ``// Initialize the array``    ``int``[] arr = { 2, 3, 5, 6 };` `    ``// Function Call``    ``Console.Write(``"[ "``);``    ``foreach``(``int` `i ``in` `calculate(arr))``        ``Console.Write(i + ``", "``);``        ` `    ``Console.Write(``"]"``);``}``}` `// This code is contributed by amal kumar choubey`

Javascript

 ``

Output:

`[8, 6, 6, 8]`

Time Complexity: O(N)
Space Complexity: O(N)

My Personal Notes arrow_drop_up