Count of only repeated element in a sorted array of consecutive elements
Given a sorted array of consecutive elements. The array has only one element repeated many times. The task is to find the length of the sequence of the repeated elements
Examples:
Input: arr[] = {1, 2, 3, 4, 4, 4, 5, 6}
Output: 4 3
Repeated element is 4 and it appears 3 times
Input: arr[] = {4, 4, 4, 4, 4}
Output: 4 5
Input: arr[] = {6, 7, 8, 9, 10, 10, 11}
Output: 10 2
Input: arr[] = {6, 7, 8, 9, 10, 10, 10}
Output: 10 3
Count of only repeated elements in a sorted array of consecutive elements using binary search:
To solve the problem follow the below idea:
We need to find two things:
- To find the number of times the element repeats:
- Suppose there is no repeated element for given array, then the least element will be at arr[0] and highest element will be at arr[n-1].
- Now each time an element is repeated, the highest element will decrease by 1 each time.
- Based on this idea, since the array is sorted and max-difference of two adjacent elements is 1, then:
count of unique elements = arr[n-1] – arr[0]
Therefore, length of the repeated element = n – count of unique elements
= n – (array[n-1] – array[0])
- To find value of repeated element:
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
pair< int , int > sequence( const vector< int >& a)
{
if (a.size() == 0)
return { 0, 0 };
int s = 0;
int e = a.size() - 1;
while (s < e) {
int m = (s + e) / 2;
if (a[m] >= m + a[0])
s = m + 1;
else
e = m;
}
return { a[s], a.size() - (a[a.size() - 1] - a[0]) };
}
int main()
{
pair< int , int > p = sequence({ 1, 2, 3, 4, 4, 4, 5, 6 });
cout << "Repeated element is " << p.first
<< ", it appears " << p.second << " times" ;
return 0;
}
|
Java
import java.awt.Point;
import java.util.Arrays;
import java.util.Vector;
class Test {
static Point sequence(Vector<Integer> a)
{
if (a.size() == 0 )
return new Point( 0 , 0 );
int s = 0 ;
int e = a.size() - 1 ;
while (s < e) {
int m = (s + e) / 2 ;
if (a.get(m) >= m + a.get( 0 ))
s = m + 1 ;
else
e = m;
}
return new Point(
a.get(s),
a.size() - (a.get(a.size() - 1 ) - a.get( 0 )));
}
public static void main(String args[])
{
Integer array[]
= new Integer[] { 1 , 2 , 3 , 4 , 4 , 4 , 5 , 6 };
Point p
= sequence( new Vector<>(Arrays.asList(array)));
System.out.println( "Repeated element is " + p.x
+ ", it appears " + p.y
+ " times" );
}
}
|
Python3
def sequence(a):
if ( len (a) = = 0 ):
return [ 0 , 0 ]
s = 0
e = len (a) - 1
while (s < e):
m = (s + e) / / 2
if (a[m] > = m + a[ 0 ]):
s = m + 1
else :
e = m
return [a[s], len (a) - (
a[ len (a) - 1 ] - a[ 0 ])]
if __name__ = = "__main__" :
p = sequence([ 1 , 2 , 3 , 4 , 4 , 4 , 5 , 6 ])
print ( "Repeated element is" , p[ 0 ],
", it appears" , p[ 1 ], "times" )
|
C#
using System;
using System.Collections.Generic;
public class Point {
public int first, second;
public Point( int first, int second)
{
this .first = first;
this .second = second;
}
}
public class Test {
static Point sequence(List< int > a)
{
if (a.Count == 0)
return new Point(0, 0);
int s = 0;
int e = a.Count - 1;
while (s < e) {
int m = (s + e) / 2;
if (a[m] >= m + a[0])
s = m + 1;
else
e = m;
}
return new Point(a[s],
a.Count - (a[a.Count - 1] - a[0]));
}
public static void Main(String[] args)
{
int [] array = new int [] { 1, 2, 3, 4, 4, 4, 5, 6 };
Point p = sequence( new List< int >(array));
Console.WriteLine( "Repeated element is " + p.first
+ ", it appears " + p.second
+ " times" );
}
}
|
Javascript
<script>
function sequence(a)
{
if (a.length == 0)
return [0, 0]
let s = 0
let e = a.length - 1
while (s < e)
{
let m = Math.floor((s + e) / 2);
if (a[m] >= m + a[0])
s = m + 1
else
e = m
}
return [a[s], a.length - (
a[a.length - 1] - a[0])]
}
let p = sequence([1, 2, 3, 4, 4, 4, 5, 6])
document.write( "Repeated element is " + p[0]+
", it appears " + p[1]+ " times" )
</script>
|
Output
Repeated element is 4, it appears 3 times
Time Complexity: O(log N)
Auxiliary Space: O(1)
Last Updated :
15 Sep, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...