Given an array of n distinct integers. The problem is to find the sum of minimum absolute difference of each array element. For an element x present at index i in the array its minimum absolute difference is calculated as:
Min absolute difference (x) = min(abs(x – arr[j])), where 1 <= j <= n and j != i and abs is the absolute value.
Input Constraint: 2 <= n
Examples:
Input : arr = {4, 1, 5}
Output : 5
Sum of absolute differences is |4-5| + |1-4| + |5-4|
Input : arr = {5, 10, 1, 4, 8, 7}
Output : 9
Input : {12, 10, 15, 22, 21, 20, 1, 8, 9}
Output : 18
Naive approach: Using two loops. Pick an element of the array using outer loop and calculate its absolute difference with rest of the array elements using inner loop. Find the minimum absolute value and add it to the sum. Time Complexity O(n2).
C++
#include <bits/stdc++.h>
using namespace std;
int sumOfMinAbsDifferences( int arr[], int n)
{
int sum = 0;
for ( int i = 0; i < n; i++) {
int diff = INT_MAX;
for ( int j = 0; j < n; j++) {
if (i != j) {
diff = min(diff, abs (arr[i] - arr[j]));
}
}
sum += diff;
}
return sum;
}
int main()
{
int arr[] = { 5, 10, 1, 4, 8, 7 };
int n = 6;
cout << "Sum = " << sumOfMinAbsDifferences(arr, n);
}
|
Java
import java.util.*;
import java.io.*;
public class GFG {
static int sumOfMinAbsDifferences(
int arr[] , int n)
{
int sum= 0 ;
for ( int i= 0 ;i<n;i++){
int diff=Integer.MAX_VALUE;
for ( int j= 0 ;j<n;j++){
if (i!=j){
diff=Math.min(diff,Math.abs(arr[i]-arr[j]));
}
}
sum+=diff;
}
return sum;
}
public static void main(String args[])
{
int arr[] = { 5 , 10 , 1 , 4 , 8 , 7 };
int n = arr.length;
System.out.println( "Sum = "
+ sumOfMinAbsDifferences(arr, n));
}
}
|
Python3
import sys
def sumOfMinAbsDifferences(arr, n):
sum = 0
for i in range (n):
diff = sys.maxsize
for j in range (n):
if i ! = j:
diff = min (diff, abs (arr[i] - arr[j]))
sum + = diff
return sum
if __name__ = = "__main__" :
arr = [ 5 , 10 , 1 , 4 , 8 , 7 ]
n = 6
print ( "Sum =" , sumOfMinAbsDifferences(arr, n))
|
C#
using System;
public class GFG
{
public static int sumOfMinAbsDifferences( int [] arr, int n)
{
var sum = 0;
for ( int i = 0; i < n; i++)
{
var diff = int .MaxValue;
for ( int j = 0; j < n; j++)
{
if (i != j)
{
diff = Math.Min(diff,Math.Abs(arr[i] - arr[j]));
}
}
sum += diff;
}
return sum;
}
public static void Main(String[] args)
{
int [] arr = {5, 10, 1, 4, 8, 7};
var n = arr.Length;
Console.WriteLine( "Sum = " + GFG.sumOfMinAbsDifferences(arr, n).ToString());
}
}
|
Javascript
function sumOfMinAbsDifferences(arr, n)
{
let sum = 0;
for (let i = 0; i < n; i++) {
let diff = Number.MAX_VALUE;
for (let j = 0; j < n; j++) {
if (i != j) {
diff = Math.min(diff,
Math.abs(arr[i] - arr[j]));
}
}
sum += diff;
}
return sum;
}
let arr = [ 5, 10, 1, 4, 8, 7 ];
let n = 6;
console.log( "Sum = " + sumOfMinAbsDifferences(arr, n));
|
Time Complexity: O(n2) where n is size of the input array. This is because two nested loops are executing.
Space Complexity: O(1) as no extra space has been used.
Efficient Approach:
The following steps are:
- Sort the array of size n.
- For the 1st element of array its min absolute difference is calculated using the 2nd array element.
- For the last array element its min absolute difference is calculated using the 2nd last array element.
- For the rest of the array elements, 1 <= i <= n-2, minimum absolute difference for an element at index i is calculated as: minAbsDiff = min( abs(arr[i] – arr[i-1]), abs(ar[i] – arr[i+1]) ).
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int sumOfMinAbsDifferences( int arr[], int n)
{
sort(arr, arr+n);
int sum = 0;
sum += abs (arr[0] - arr[1]);
sum += abs (arr[n-1] - arr[n-2]);
for ( int i=1; i<n-1; i++)
sum += min( abs (arr[i] - arr[i-1]), abs (arr[i] - arr[i+1]));
return sum;
}
int main()
{
int arr[] = {5, 10, 1, 4, 8, 7};
int n = sizeof (arr) / sizeof (arr[0]);
cout << "Sum = "
<< sumOfMinAbsDifferences(arr, n);
}
|
Java
import java.io.*;
import java.util.Arrays;
public class GFG {
static int sumOfMinAbsDifferences(
int arr[] , int n)
{
Arrays.sort(arr);
int sum = 0 ;
sum += Math.abs(arr[ 0 ] - arr[ 1 ]);
sum += Math.abs(arr[n- 1 ] - arr[n- 2 ]);
for ( int i = 1 ; i < n - 1 ; i++)
sum +=
Math.min(Math.abs(arr[i] - arr[i- 1 ]),
Math.abs(arr[i] - arr[i+ 1 ]));
return sum;
}
public static void main(String args[])
{
int arr[] = { 5 , 10 , 1 , 4 , 8 , 7 };
int n = arr.length;
System.out.println( "Sum = "
+ sumOfMinAbsDifferences(arr, n));
}
}
|
Python3
def sumOfMinAbsDifferences(arr,n):
arr.sort()
sum = 0
sum + = abs (arr[ 0 ] - arr[ 1 ]);
sum + = abs (arr[n - 1 ] - arr[n - 2 ]);
for i in range ( 1 , n - 1 ):
sum + = min ( abs (arr[i] - arr[i - 1 ]),
abs (arr[i] - arr[i + 1 ]))
return sum ;
arr = [ 5 , 10 , 1 , 4 , 8 , 7 ]
n = len (arr)
print ( "Sum = " , sumOfMinAbsDifferences(arr, n))
|
C#
using System;
public class GFG {
static int sumOfMinAbsDifferences(
int []arr , int n)
{
Array.Sort(arr);
int sum = 0;
sum += Math.Abs(arr[0] - arr[1]);
sum += Math.Abs(arr[n-1] - arr[n-2]);
for ( int i = 1; i < n - 1; i++)
sum +=
Math.Min(Math.Abs(arr[i] - arr[i-1]),
Math.Abs(arr[i] - arr[i+1]));
return sum;
}
public static void Main ()
{
int []arr = {5, 10, 1, 4, 8, 7};
int n = arr.Length;
Console.Write( "Sum = "
+ sumOfMinAbsDifferences(arr, n));
}
}
|
PHP
<?php
function sumOfMinAbsDifferences( $arr , $n )
{
sort( $arr );
sort( $arr , $n );
$sum = 0;
$sum += abs ( $arr [0] - $arr [1]);
$sum += abs ( $arr [ $n - 1] - $arr [ $n - 2]);
for ( $i = 1; $i < $n - 1; $i ++)
$sum += min( abs ( $arr [ $i ] - $arr [ $i - 1]),
abs ( $arr [ $i ] - $arr [ $i + 1]));
return $sum ;
}
$arr = array (5, 10, 1, 4, 8, 7);
$n = sizeof( $arr );
echo "Sum = " , sumOfMinAbsDifferences( $arr , $n );
?>
|
Javascript
<script>
function sumOfMinAbsDifferences(arr, n)
{
arr.sort( function (a, b){ return a - b});
let sum = 0;
sum += Math.abs(arr[0] - arr[1]);
sum += Math.abs(arr[n-1] - arr[n-2]);
for (let i = 1; i < n - 1; i++)
sum +=
Math.min(Math.abs(arr[i] - arr[i-1]),
Math.abs(arr[i] - arr[i+1]));
return sum;
}
let arr = [5, 10, 1, 4, 8, 7];
let n = arr.length;
document.write( "Sum = " + sumOfMinAbsDifferences(arr, n));
</script>
|
Time Complexity: O(n log n)
Auxiliary Space: O(1)
This article is contributed by Ayush Jauhari. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.