Question: Write a function to find if a given integer x appears more than n/2 times in a sorted array of n integers.Â
Basically, we need to write a function say isMajority() that takes an array (arr[] ), array’s size (n) and a number to be searched (x) as parameters and returns true if x is a majority element (present more than n/2 times).
Examples:Â
Input: arr[] = {1, 2, 3, 3, 3, 3, 10}, x = 3
Output: True (x appears more than n/2 times in the given array)
Input: arr[] = {1, 1, 2, 4, 4, 4, 6, 6}, x = 4
Output: False (x doesn't appear more than n/2 times in the given array)
Input: arr[] = {1, 1, 1, 2, 2}, x = 1
Output: True (x appears more than n/2 times in the given array)
METHOD 1 (Using Linear Search)Â
Linearly search for the first occurrence of the element, once you find it (let at index i), check element at index i + n/2. If element is present at i+n/2 then return 1 else return 0.
Java
import java.io.*;
class Majority {
static boolean isMajority( int arr[], int n, int x)
{
int i, last_index = 0 ;
last_index = (n% 2 == 0 )? n/ 2 : n/ 2 + 1 ;
for (i = 0 ; i < last_index; i++)
{
if (arr[i] == x && arr[i+n/ 2 ] == x)
return true ;
}
return false ;
}
public static void main (String[] args) {
int arr[] = { 1 , 2 , 3 , 4 , 4 , 4 , 4 };
int n = arr.length;
int x = 4 ;
if (isMajority(arr, n, x)== true )
System.out.println(x+ " appears more than " +
n/ 2 + " times in arr[]" );
else
System.out.println(x+ " does not appear more than " +
n/ 2 + " times in arr[]" );
}
}
|
Output:Â
4 appears more than 3 times in arr[]
Time Complexity: O(n)
METHOD 2 (Using Binary Search)Â
Use binary search methodology to find the first occurrence of the given number. The criteria for binary search is important here.Â
Java
import java.io.*;
class Majority {
static int _binarySearch( int arr[], int low, int high, int x)
{
if (high >= low)
{
int mid = (low + high)/ 2 ;
if ( (mid == 0 || x > arr[mid- 1 ]) && (arr[mid] == x) )
return mid;
else if (x > arr[mid])
return _binarySearch(arr, (mid + 1 ), high, x);
else
return _binarySearch(arr, low, (mid - 1 ), x);
}
return - 1 ;
}
static boolean isMajority( int arr[], int n, int x)
{
int i = _binarySearch(arr, 0 , n- 1 , x);
if (i == - 1 )
return false ;
if (((i + n/ 2 ) <= (n - 1 )) && arr[i + n/ 2 ] == x)
return true ;
else
return false ;
}
public static void main (String[] args) {
int arr[] = { 1 , 2 , 3 , 3 , 3 , 3 , 10 };
int n = arr.length;
int x = 3 ;
if (isMajority(arr, n, x)== true )
System.out.println(x + " appears more than " +
n/ 2 + " times in arr[]" );
else
System.out.println(x + " does not appear more than " +
n/ 2 + " times in arr[]" );
}
}
|
Output:Â
3 appears more than 3 times in arr[]
Time Complexity: O(Logn)Â
Algorithmic Paradigm: Divide and Conquer
METHOD 3: If it is already given that the array is sorted and there exists a majority element, checking if a particular element is as easy as checking if the middle element of the array is the number we are checking against.
Since a majority element occurs more than n/2 times in an array, it will always be the middle element. We can use this logic to check if the given number is the majority element.
Java
import java.util.*;
class GFG{
static boolean isMajorityElement( int arr[], int n,
int key)
{
if (arr[n / 2 ] == key)
return true ;
else
return false ;
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 3 , 3 , 3 , 3 , 10 };
int n = arr.length;
int x = 3 ;
if (isMajorityElement(arr, n, x))
System.out.printf( "%d appears more than %d " +
"times in arr[]" , x, n / 2 );
else
System.out.printf( "%d does not appear more " +
"than %d times in " + "arr[]" ,
x, n / 2 );
}
}
|
Output3 appears more than 3 times in arr[]
Time complexity: O(1)
Auxiliary Space: O(1)
Please refer complete article on Check for Majority Element in a sorted array for more details!
Last Updated :
13 Dec, 2021
Like Article
Save Article
Vote for difficulty