k-th distinct (or non-repeating) element among unique elements in an array.
Last Updated :
19 Oct, 2022
Given an integer array, print k-th distinct element in an array. The given array may contain duplicates and the output should print k-th element among all unique elements. If k is more than number of distinct elements, print -1.
Examples :
Input : arr[] = {1, 2, 1, 3, 4, 2},
k = 2
Output : 4
First non-repeating element is 3
Second non-repeating element is 4
Input : arr[] = {1, 2, 50, 10, 20, 2},
k = 3
Output : 10
Input : {2, 2, 2, 2},
k = 2
Output : -1
A simple solution is to use two nested loops where outer loop picks elements from left to right, and inner loop checks if the picked element is present somewhere else. If not present, then increment count of distinct elements. If count becomes k, return current element.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int printKDistinct( int arr[], int n,
int k)
{
int dist_count = 0;
for ( int i = 0; i < n; i++)
{
int j;
for (j = 0; j < n; j++)
if (i != j && arr[j] == arr[i])
break ;
if (j == n)
dist_count++;
if (dist_count == k)
return arr[i];
}
return -1;
}
int main ()
{
int ar[] = {1, 2, 1, 3, 4, 2};
int n = sizeof (ar) / sizeof (ar[0]);
int k = 2;
cout << printKDistinct(ar, n, k);
return 0;
}
|
Java
class GFG
{
static int printKDistinct( int arr[],
int n,
int k)
{
int dist_count = 0 ;
for ( int i = 0 ; i < n; i++)
{
int j;
for (j = 0 ; j < n; j++)
if (i != j && arr[j] == arr[i])
break ;
if (j == n)
dist_count++;
if (dist_count == k)
return arr[i];
}
return - 1 ;
}
public static void main (String[] args)
{
int ar[] = { 1 , 2 , 1 , 3 , 4 , 2 };
int n = ar.length;
int k = 2 ;
System.out.print(printKDistinct(ar, n, k));
}
}
|
Python3
def printKDistinct(arr, n, k):
dist_count = 0
for i in range (n):
j = 0
while j < n:
if (i ! = j and arr[j] = = arr[i]):
break
j + = 1
if (j = = n):
dist_count + = 1
if (dist_count = = k):
return arr[i]
return - 1
ar = [ 1 , 2 , 1 , 3 , 4 , 2 ]
n = len (ar)
k = 2
print (printKDistinct(ar, n, k))
|
C#
using System;
class GFG
{
static int printKDistinct( int []arr,
int n,
int k)
{
int dist_count = 0;
for ( int i = 0; i < n; i++)
{
int j;
for (j = 0; j < n; j++)
if (i != j && arr[j] == arr[i])
break ;
if (j == n)
dist_count++;
if (dist_count == k)
return arr[i];
}
return -1;
}
public static void Main ()
{
int []ar = {1, 2, 1, 3, 4, 2};
int n = ar.Length;
int k = 2;
Console.Write(printKDistinct(ar, n, k));
}
}
|
PHP
<?php
function printKDistinct( $arr ,
$n , $k )
{
$dist_count = 0;
for ( $i = 0; $i < $n ; $i ++)
{
$j ;
for ( $j = 0; $j < $n ; $j ++)
if ( $i != $j && $arr [ $j ] ==
$arr [ $i ])
break ;
if ( $j == $n )
$dist_count ++;
if ( $dist_count == $k )
return $arr [ $i ];
}
return -1;
}
$ar = array (1, 2, 1, 3, 4, 2);
$n = sizeof( $ar ) / sizeof( $ar [0]);
$k = 2;
echo printKDistinct( $ar , $n , $k );
?>
|
Javascript
<script>
function printKDistinct(arr, n, k)
{
var dist_count = 0;
for ( var i = 0; i < n; i++)
{
var j;
for (j = 0; j < n; j++)
if (i != j && arr[j] == arr[i])
break ;
if (j == n)
dist_count++;
if (dist_count == k)
return arr[i];
}
return -1;
}
var ar = [1, 2, 1, 3, 4, 2];
var n = ar.length;
var k = 2;
document.write( printKDistinct(ar, n, k));
</script>
|
Time Complexity: O(n^2)
Auxiliary Space: O(1)
An efficient solution is to use Hashing to solve this in O(n) time on average.
- create an empty hash table.
- Traverse input array from left to right and store elements and their counts in the hash table.
- Traverse input array again from left to right. Keep counting elements with count as 1.
- If count becomes k, return current element.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int printKDistinct( int arr[],
int n, int k)
{
unordered_map< int , int > h;
for ( int i = 0; i < n; i++)
h[arr[i]]++;
if (h.size() < k)
return -1;
int dist_count = 0;
for ( int i = 0; i < n; i++)
{
if (h[arr[i]] == 1)
dist_count++;
if (dist_count == k)
return arr[i];
}
return -1;
}
int main ()
{
int ar[] = {1, 2, 1, 3, 4, 2};
int n = sizeof (ar) / sizeof (ar[0]);
cout << printKDistinct(ar, n, 2);
return 0;
}
|
Java
import java.util.*;
class GfG
{
static int printKDistinct( int arr[],
int n, int k)
{
Map <Integer, Integer> h =
new HashMap<Integer, Integer> ();
for ( int i = 0 ; i < n; i++)
{
if (h.containsKey(arr[i]))
h.put(arr[i], h.get(arr[i]) + 1 );
else
h.put(arr[i], 1 );
}
if (h.size() < k)
return - 1 ;
int dist_count = 0 ;
for ( int i = 0 ; i < n; i++)
{
if (h.get(arr[i]) == 1 )
dist_count++;
if (dist_count == k)
return arr[i];
}
return - 1 ;
}
public static void main (String[] args)
{
int ar[] = { 1 , 2 , 1 , 3 , 4 , 2 };
int n = ar.length;
System.out.println(printKDistinct(ar, n, 2 ));
}
}
|
Python3
def printKDistinct(arr, size, KthIndex):
dict = {}
vect = []
for i in range (size):
if (arr[i] in dict ):
dict [arr[i]] = dict [arr[i]] + 1
else :
dict [arr[i]] = 1
for i in range (size):
if ( dict [arr[i]] > 1 ):
continue
else :
KthIndex = KthIndex - 1
if (KthIndex = = 0 ):
return arr[i]
return - 1
arr = [ 1 , 2 , 1 , 3 , 4 , 2 ]
size = len (arr)
print (printKDistinct(arr, size, 2 ))
|
C#
using System;
using System.Collections.Generic;
class GfG
{
static int printKDistinct( int []arr,
int n, int k)
{
Dictionary< int , int > h = new Dictionary< int , int >();
for ( int i = 0; i < n; i++)
{
if (h.ContainsKey(arr[i]))
{
var val = h[arr[i]];
h.Remove(arr[i]);
h.Add(arr[i], val + 1);
}
else
h.Add(arr[i], 1);
}
if (h.Count < k)
return -1;
int dist_count = 0;
for ( int i = 0; i < n; i++)
{
if (h[arr[i]] == 1)
dist_count++;
if (dist_count == k)
return arr[i];
}
return -1;
}
public static void Main (String[] args)
{
int []ar = {1, 2, 1, 3, 4, 2};
int n = ar.Length;
Console.WriteLine(printKDistinct(ar, n, 2));
}
}
|
Javascript
<script>
function printKDistinct(arr,n,k)
{
let h = new Map();
for (let i = 0; i < n; i++)
{
if (h.has(arr[i]))
h.set(arr[i], h.get(arr[i]) + 1);
else
h.set(arr[i], 1);
}
if (h.length < k)
return -1;
let dist_count = 0;
for (let i = 0; i < n; i++)
{
if (h.get(arr[i]) == 1)
dist_count++;
if (dist_count == k)
return arr[i];
}
return -1;
}
let ar=[1, 2, 1, 3, 4, 2];
let n = ar.length;
document.write(printKDistinct(ar, n, 2));
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(n)
Please Login to comment...