Skip to content
Related Articles
Open in App
Not now

Related Articles

Sum of squares of differences between all pairs of an array

Improve Article
Save Article
  • Difficulty Level : Hard
  • Last Updated : 29 Jan, 2022
Improve Article
Save Article

Given an array arr[] of size N, the task is to compute the sum of squares of differences of all possible pairs.

Examples:

Input: arr[] = {2, 8, 4}
Output: 56
Explanation: 
Sum of squared differences of all possible pairs = (2 – 8)2 + (2 – 4)2 + (8 – 4)2 = 56

Input: arr[] = {-5, 8, 9, -4, -3}
Output: 950

 

Naive Approach: The simplest approach is to generate all possible pairs and calculate the square of their differences of each pair and keep adding it to a variable, say sum. Finally, print the value of sum.

Time Complexity: O(N2)
Auxiliary Space: O(1)

Efficient Approach: The optimal idea is based on rearranging the expression in the following manner:

∑i=2 n ∑j=1i-1 (Ai-Aj)2 

Since Ai – A = 0, the above expression can be rearranged as 1/2*(∑i=1n ∑j=1n (Ai-Aj)2) which can be further be simplified using the identity:

(A – B)2 = A2 + B2 – 2 * A * B 

As 1/2*(∑i=1n ∑j=1n (Ai2 + Aj2 – 2*Ai*Aj)) = 1/2 * (2*n*∑i=1n Ai2  – 2*∑i=1n (Aj * ∑j=1n Aj))

The final expression is n*∑i=1n Ai2 – (∑i=1nAi)2 which can be computed by linearly iterating over the array.

Below is the implementation of the above approach:

C++




// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to calculate sum of squares
// of differences of all possible pairs
void sumOfSquaredDifferences(int arr[],
                             int N)
{
    // Stores the final sum
    int ans = 0;
 
    // Stores temporary values
    int sumA = 0, sumB = 0;
 
    // Traverse the array
    for (int i = 0; i < N; i++) {
        sumA += (arr[i] * arr[i]);
        sumB += arr[i];
    }
 
    sumA = N * sumA;
    sumB = (sumB * sumB);
 
    // Final sum
    ans = sumA - sumB;
 
    // Print the answer
    cout << ans;
}
 
// Driver Code
int main()
{
    // Given array
    int arr[] = { 2, 8, 4 };
 
    // Size of the array
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Function call to find sum of square
    // of differences of all possible pairs
    sumOfSquaredDifferences(arr, N);
 
    return 0;
}

Java




// Java program for the above approach
class GFG{
     
// Function to calculate sum of squares
// of differences of all possible pairs
static void sumOfSquaredDifferences(int arr[],
                                    int N)
{
     
    // Stores the final sum
    int ans = 0;
 
    // Stores temporary values
    int sumA = 0, sumB = 0;
 
    // Traverse the array
    for(int i = 0; i < N; i++)
    {
        sumA += (arr[i] * arr[i]);
        sumB += arr[i];
    }
 
    sumA = N * sumA;
    sumB = (sumB * sumB);
 
    // Final sum
    ans = sumA - sumB;
 
    // Print the answer
    System.out.println(ans);
}
 
// Driver Code
public static void main (String[] args)
{
     
    // Given array
    int arr[] = { 2, 8, 4 };
 
    // Size of the array
    int N = arr.length;
 
    // Function call to find sum of square
    // of differences of all possible pairs
    sumOfSquaredDifferences(arr, N);
}
}
 
// This code is contributed by AnkThon

Python3




# Python3 program for the above approach
 
# Function to calculate sum of squares
# of differences of all possible pairs
def sumOfSquaredDifferences(arr, N):
   
    # Stores the final sum
    ans = 0
 
    # Stores temporary values
    sumA, sumB = 0, 0
 
    # Traverse the array
    for i in range(N):
        sumA += (arr[i] * arr[i])
        sumB += arr[i]
 
    sumA = N * sumA
    sumB = (sumB * sumB)
 
    # Final sum
    ans = sumA - sumB
 
    # Print the answer
    print(ans)
 
# Driver Code
if __name__ == '__main__':
   
    # Given array
    arr = [2, 8, 4]
 
    # Size of the array
    N = len(arr)
     
    # Function call to find sum of square
    # of differences of all possible pairs
    sumOfSquaredDifferences(arr, N)
 
# This code is contributed by mohit kumar 29.

C#




// C# program for the above approach
using System;
 
class GFG{
     
// Function to calculate sum of squares
// of differences of all possible pairs
static void sumOfSquaredDifferences(int []arr,
                                    int N)
{
     
    // Stores the final sum
    int ans = 0;
 
    // Stores temporary values
    int sumA = 0, sumB = 0;
 
    // Traverse the array
    for(int i = 0; i < N; i++)
    {
        sumA += (arr[i] * arr[i]);
        sumB += arr[i];
    }
 
    sumA = N * sumA;
    sumB = (sumB * sumB);
 
    // Final sum
    ans = sumA - sumB;
 
    // Print the answer
    Console.WriteLine(ans);
}
 
// Driver Code
public static void Main(string[] args)
{
     
    // Given array
    int []arr = { 2, 8, 4 };
 
    // Size of the array
    int N = arr.Length;
 
    // Function call to find sum of square
    // of differences of all possible pairs
    sumOfSquaredDifferences(arr, N);
}
}
 
// This code is contributed by AnkThon

Javascript




<script>
 
// Javascript program for the above approach
 
// Function to calculate sum of squares
// of differences of all possible pairs
function sumOfSquaredDifferences(arr, N)
{
     
    // Stores the final sum
    let ans = 0;
 
    // Stores temporary values
    let sumA = 0, sumB = 0;
 
    // Traverse the array
    for(let i = 0; i < N; i++)
    {
        sumA += (arr[i] * arr[i]);
        sumB += arr[i];
    }
 
    sumA = N * sumA;
    sumB = (sumB * sumB);
 
    // Final sum
    ans = sumA - sumB;
 
    // Print the answer
    document.write(ans);
}
 
// Driver Code
 
// Given array
let arr = [ 2, 8, 4 ];
 
// Size of the array
let N = arr.length;
 
// Function call to find sum of square
// of differences of all possible pairs
sumOfSquaredDifferences(arr, N);
 
// This code is contributed by subhammahato348
 
</script>

Output: 

56

 

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


My Personal Notes arrow_drop_up
Related Articles

Start Your Coding Journey Now!