Given an integer array with repeated elements, the task is to find sum of all distinct elements in array.
Examples:
Input : arr[] = {12, 10, 9, 45, 2, 10, 10, 45,10};
Output : 78
Here we take 12, 10, 9, 45, 2 for sum
because it's distinct elements
Input : arr[] = {1, 10, 9, 4, 2, 10, 10, 45 , 4};
Output : 71
A Simple Solution is to use two nested loops. The outer loop picks an element one by one starting from the leftmost element. The inner loop checks if the element is present on left side of it. If present, then ignores the element.
Time Complexity : O(n2)
Auxiliary Space : O(1)
A Better Solution of this problem is that using sorting technique we firstly sort all elements of array in ascending order and and find one by one distinct elements in array.
C++
#include<bits/stdc++.h>
using namespace std;
int findSum( int arr[], int n)
{
sort(arr, arr + n);
int sum = 0;
for ( int i=0; i<n; i++)
{
if (arr[i] != arr[i+1])
sum = sum + arr[i];
}
return sum;
}
int main()
{
int arr[] = {1, 2, 3, 1, 1, 4, 5, 6};
int n = sizeof (arr)/ sizeof ( int );
cout << findSum(arr, n);
return 0;
}
|
Java
import java.util.Arrays;
public class GFG {
static int findSum( int arr[], int n) {
Arrays.sort(arr);
int sum = arr[ 0 ];
for ( int i = 0 ; i < n- 1 ; i++) {
if (arr[i] != arr[i + 1 ]) {
sum = sum + arr[i+ 1 ];
}
}
return sum;
}
public static void main(String[] args) {
int arr[] = { 1 , 2 , 3 , 1 , 1 , 4 , 5 , 6 };
int n = arr.length;
System.out.println(findSum(arr, n));
}
}
|
Python3
def findSum(arr, n):
arr.sort()
sum = arr[ 0 ]
for i in range ( 0 ,n - 1 ):
if (arr[i] ! = arr[i + 1 ]):
sum = sum + arr[i + 1 ]
return sum
def main():
arr = [ 1 , 2 , 3 , 1 , 1 , 4 , 5 , 6 ]
n = len (arr)
print (findSum(arr, n))
if __name__ = = '__main__' :
main()
|
C#
using System;
class GFG
{
static int findSum( int []arr, int n)
{
Array.Sort(arr);
int sum = arr[0];
for ( int i = 0; i < n - 1; i++)
{
if (arr[i] != arr[i + 1])
{
sum = sum + arr[i + 1];
}
}
return sum;
}
public static void Main()
{
int []arr = {1, 2, 3, 1, 1, 4, 5, 6};
int n = arr.Length;
Console.WriteLine(findSum(arr, n));
}
}
|
Javascript
<script>
function findSum(arr, n)
{
arr.sort();
let sum = 0;
for (let i=0; i<n; i++)
{
if (arr[i] != arr[i+1])
sum = sum + arr[i];
}
return sum;
}
let arr = [1, 2, 3, 1, 1, 4, 5, 6];
let n = arr.length;
document.write(findSum(arr, n));
</script>
|
Output:
21
Time Complexity : O(n log n)
Space Complexity : O(1)
An Efficient solution of this problem is that using unordered_set we run a single for loop and which value comes first time its add in sum variable and store in hash table that for next time we not use this value.
C++
#include<bits/stdc++.h>
using namespace std;
int findSum( int arr[], int n)
{
int sum = 0;
unordered_set< int > s;
for ( int i=0; i<n; i++)
{
if (s.find(arr[i]) == s.end())
{
sum += arr[i];
s.insert(arr[i]);
}
}
return sum;
}
int main()
{
int arr[] = {1, 2, 3, 1, 1, 4, 5, 6};
int n = sizeof (arr)/ sizeof ( int );
cout << findSum(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int findSum( int arr[], int n)
{
int sum = 0 ;
HashSet<Integer> s = new HashSet<Integer>();
for ( int i = 0 ; i < n; i++)
{
if (!s.contains(arr[i]))
{
sum += arr[i];
s.add(arr[i]);
}
}
return sum;
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 3 , 1 , 1 , 4 , 5 , 6 };
int n = arr.length;
System.out.println(findSum(arr, n));
}
}
|
Python3
def findSum(arr, n):
s = set ()
sum = 0
for i in range (n):
if arr[i] not in s:
s.add(arr[i])
for i in s:
sum = sum + i
return sum
arr = [ 1 , 2 , 3 , 1 , 1 , 4 , 5 , 6 ]
n = len (arr)
print (findSum(arr, n))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int findSum( int []arr, int n)
{
int sum = 0;
HashSet< int > s = new HashSet< int >();
for ( int i = 0; i < n; i++)
{
if (!s.Contains(arr[i]))
{
sum += arr[i];
s.Add(arr[i]);
}
}
return sum;
}
public static void Main(String[] args)
{
int []arr = {1, 2, 3, 1, 1, 4, 5, 6};
int n = arr.Length;
Console.WriteLine(findSum(arr, n));
}
}
|
Output:
21
Time Complexity : O(n)
Auxiliary Space : O(n)
This article is contributed by DANISH_RAZA. 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 write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
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.