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

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| = 4distance(3) = |3 – 2| + |3 – 5| = 3distance(5) = |5 – 2| + |5 – 3| = 5Therefore, 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|= 8distance(3) = |3 – 2| + |3 – 5| + |3 – 6|= 6distance(5) = |5 – 2| + |5 – 3| + |5 – 6|= 6distance(6) = |6 – 2| + |6 – 3| + |6 – 5|= 8Therefore, 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++
Java
Python3
C#
Javascript
// C++ program for the above approach#include <bits/stdc++.h>using namespace std; // Function to return the new arrayvector<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 Codeint 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 program for the above approachimport java.util.*; class GFG {     // Function to return the new array    private static List<Integer>    calculate(int[] arr)    {        // Length of the arraylist        int n = arr.length;         // Initialize the Arraylist        List<Integer> ans            = new ArrayList<Integer>();         // 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 program for the above approach # Function to return the new array# private static List<Integer>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 Codeif __name__ == '__main__':     # Given array arr[]    arr = [ 2, 3, 5, 6 ]     # Function call    print(calculate(arr)) # This code is contributed by mohit kumar 29
// C# program for the above approachusing System;using System.Collections;using System.Collections.Generic; class GFG{ // Function to return the new arrayprivate 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 Codepublic 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
<script> // Javascript program for// the above approach    // Function to return the new array   function    calculate(arr)    {        // Length of the arraylist        let n = arr.length;          // Initialize the Arraylist        let ans            = [];          // Sum of absolute differences        // of element with all elements        for (let i = 0;            i < arr.length; i++) {              // Initialize let sum to 0            let sum = 0;              for (let j = 0;                j < arr.length; j++) {                  sum += Math.abs(arr[i] - arr[j]);            }              // Add the value of sum to ans            ans.push(sum);        }          // Return the final ans        return ans;    }     // Driver Code         // Given array arr[]       let arr = [ 2, 3, 5, 6 ];          // Function Call        document.write(calculate(arr)); </script>
[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:
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++
Java
Python3
C#
Javascript
// C++ program for the// above approach#include <bits/stdc++.h>using namespace std; // Function to return list of// total Distance of each element// from other elements in arrayvector<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 Codeint 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 program for the above approachimport java.util.*; class GFG {     // Function to return list of    // total Distance of each element    // from other elements in array    private static List<Integer>    calculate(int[] arr)    {        // Length of the array        int n = arr.length;        int sub = 0;        int sum = 0;         // Initialize the arraylist        List<Integer> ans            = new ArrayList<Integer>();         // 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 program for the above approach # Function to return list of# total Distance of each element# from other elements in arraydef 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 Codeif __name__ == '__main__':         # Initialize the array    arr = [ 2, 3, 5, 6 ]     # Function call    print(calculate(arr)) # This code is contributed by himanshu77
// C# program for the above approachusing System;using System.Collections.Generic; class GFG{ // Function to return list of// total Distance of each element// from other elements in arrayprivate 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 Codepublic 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
<script>// Javascript program for the// above approach // Function to return list of// total Distance of each element// from other elements in arrayfunction calculate(arr, n){  var sub = 0;  var sum = 0;   // Initialize the arraylist  var ans = [];   // Keep track of the  // accumulated of the  // sum of values to right  for (var i = n - 1;           i >= 0; i--)    sum += arr[i];   // Keep track of the  // accumulated subtraction  // of the values to the left  for (var i = 0; i < n; i++)  {    sum -= arr[i];     // Add the value to the    // resultant array ans[]    ans.push(sub + (i * arr[i]) -                 ((n - i - 1) *                   arr[i]) + sum);     sub -= arr[i];  }     // Return the final  // answer  return ans;} // Driver Code// Initialize the arrayvar arr = [2, 3, 5, 6]var n = arr.length;var ans = (calculate(arr, n)); for (var i = 0; i < n; i++)  document.write( ans[i] + " "); // This code is contributed by famously.</script>
[8, 6, 6, 8]
 
Time Complexity: O(N)Space Complexity: O(N)
mohit kumar 29
rutvik_56
Amal Kumar Choubey
himanshu77
jrishabh99
ukasp
target_2
famously
Arrays
Greedy
Mathematical
Arrays
Greedy
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Maximum and minimum of an array using minimum number of comparisons
Top 50 Array Coding Problems for Interviews
Stack Data Structure (Introduction and Program)
Introduction to Arrays
Multidimensional Arrays in Java
Dijkstra's shortest path algorithm | Greedy Algo-7
Prim’s Minimum Spanning Tree (MST) | Greedy Algo-5
Kruskal’s Minimum Spanning Tree Algorithm | Greedy Algo-2
Write a program to print all permutations of a given string
Huffman Coding | Greedy Algo-3