Given an array of n elements such that every element of the array is an integer in the range 1 to n, find the sum of all the distinct elements of the array.
Examples:
Input: arr[] = {5, 1, 2, 4, 6, 7, 3, 6, 7} Output: 28 The distinct elements in the array are 1, 2, 3, 4, 5, 6, 7 Input: arr[] = {1, 1, 1} Output: 1
The problem has appeared here as a general problem and the solution will work for the above case also. But a better approach is explained below.
The approach is to mark the occurrences of the array elements by making the elements at those indices negative. Example, a[0] = 1, a[1] = 1, a[2] = 1.
We check if a[abs(a[i])-1] is >=0, if yes, mark a[abs(a[i])-1] as negative. i.e. a[0] = 1 >=0, we mark a[1-1] as a[0] = -1. Next, a[1], check if (abs(a[1]-1) is +ve or not. If -ve, it means a[1] has already occurred before, else it is the first occurrence of this element.
Implementation:
// C++ program to find sum of distinct elements #include <iostream> using namespace std;
// Returns sum of distinct elements in arr[] assuming // that elements in a[] are in range from 1 to n. int sumOfDistinct( int a[], int n)
{ int sum = 0;
for ( int i = 0; i < n; i++) {
// If element appears first time
if (a[ abs (a[i]) - 1] >= 0) {
sum += abs (a[i]);
a[ abs (a[i]) - 1] *= -1;
}
}
return sum;
} // Driver code int main()
{ int a[] = { 5, 1, 2, 4, 6, 7, 3, 6, 7 };
int n = sizeof (a)/ sizeof (a[0]);
cout << sumOfDistinct(a, n) << endl;
return 0;
} |
// JAVA program to find sum of distinct // elements in sorted order import java.io.*;
import java.util.*;
import java.math.*;
class GFG{
// Returns sum of distinct elements in arr[]
// assuming that elements in a[] are in
// range from 1 to n.
static int sumOfDistinct( int a[], int n)
{
int sum = 0 ;
for ( int i = 0 ; i < n; i++) {
// If element appears first time
if (a[(Math.abs(a[i]) - 1 )] >= 0 ) {
sum += Math.abs(a[i]);
a[(Math.abs(a[i]) - 1 )] *= - 1 ;
}
}
return sum;
}
// Driver code
public static void main(String args[])
{
int a[] = { 5 , 1 , 2 , 4 , 6 , 7 , 3 , 6 , 7 };
int n = a.length;
System.out.println(sumOfDistinct(a, n) );
}
} // This code is contributed by Nikita Tiwari. |
# Python program to find sum of distinct elements # in sorted order import math
# Returns sum of distinct elements in arr[] # assuming that elements in a[] are in # range from 1 to n. def sumOfDistinct(a , n) :
sum = 0
i = 0
while i < n:
# If element appears first time
if (a[ abs (a[i]) - 1 ] > = 0 ) :
sum = sum + abs (a[i])
a[ abs (a[i]) - 1 ] = a[ abs (a[i]) - 1 ] * ( - 1 )
i = i + 1
return sum ;
# Driver code a = [ 5 , 1 , 2 , 4 , 6 , 7 , 3 , 6 , 7 ]
n = len (a)
print (sumOfDistinct(a, n))
# This code is contributed by Nikita Tiwari. |
// C# program to find sum of distinct // elements in sorted order using System;
class GFG{
// Returns sum of distinct elements
// in arr[] assuming that elements
// in a[] are in range from 1 to n
static int sumOfDistinct( int []a, int n)
{
int sum = 0;
for ( int i = 0; i < n; i++) {
// If element appears first time
if (a[(Math.Abs(a[i]) - 1)] >= 0) {
sum += Math.Abs(a[i]);
a[(Math.Abs(a[i]) - 1)] *= - 1;
}
}
return sum;
}
// Driver code
public static void Main()
{
int []a = {5, 1, 2, 4, 6, 7, 3, 6, 7};
int n = a.Length;
Console.Write(sumOfDistinct(a, n));
}
} // This code is contributed by Nitin Mittal |
<?php // PHP program to find sum of // distinct elements // Returns sum of distinct // elements in arr[] assuming // that elements in a[] are // in range from 1 to n. function sumOfDistinct( $a , $n )
{ $sum = 0;
for ( $i = 0; $i < $n ; $i ++)
{
// If element appears first time
if ( $a [ abs ( $a [ $i ]) - 1] >= 0)
{
$sum += abs ( $a [ $i ]);
$a [ abs ( $a [ $i ]) - 1] *= -1;
}
}
return $sum ;
} // Driver code
$a = array (5, 1, 2, 4, 6, 7, 3, 6, 7);
$n = sizeof( $a );
echo sumOfDistinct( $a , $n ) ;
// This code is contributed by nitin mittal ?> |
<script> // java script program to find sum of // distinct elements // Returns sum of distinct // elements in arr[] assuming // that elements in a[] are // in range from 1 to n. function sumOfDistinct(a, n)
{ let sum = 0;
for (let i = 0; i < n; i++)
{
// If element appears first time
if (a[(Math.abs(a[i])) - 1] >= 0) {
sum += Math.abs(a[i]);
a[(Math.abs(a[i]) - 1)] *= -1;
}
}
return sum;
} // Driver code
let a = [5, 1, 2, 4, 6, 7, 3, 6, 7];
let n = a.length;
document.write( sumOfDistinct(a, n));
//contributed by bobby </script> |
28
Time complexity: O(n)
Auxiliary Space : O(1)