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

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 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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include <bits/stdc++.h>
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

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program for the above approach 
import 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)); 
    
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


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

  1. Find the sum of all the elements in the given array(say sum).
  2. Initialize sub as 0.
  3. 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.
  4. Print the resultant array after the above steps.

Below is the implementation of the above approach:

Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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<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)); 
    

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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 

chevron_right


Output: 

[8, 6, 6, 8]

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

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.




My Personal Notes arrow_drop_up

Recommended Posts:


Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.