先决条件:多数元素,多数元素|设置2(散列)
给定大小为N的数组,找到多数元素。多数元素是在给定数组中出现n / 2次以上的元素。
例子:
Input: {3, 3, 4, 2, 4, 4, 2, 4, 4}
Output: 4
Input: {3, 3, 6, 2, 4, 4, 2, 4}
Output: No Majority Element
方法:
在这篇文章中,我们借助于数组中存在的数字的二进制表示来解决该问题。
任务是找到出现次数超过n / 2次的元素。因此,它看起来比所有其他数字的总和还多。
因此,我们从数组每个数字的LSB(最低有效位)开始,计算设置的数组数字。如果在n / 2个数字中设置了任意一位,则在我们的多数元素中设置了该位。
上面的方法之所以有效,是因为对于所有其他数字,设置的位数不能超过n / 2,因为多数元素的出现次数超过n / 2次。
让我们借助示例
Input : {3, 3, 4, 2, 4, 4, 2, 4, 4}
Binary representation of the same are:
3 - 0 1 1
3 - 0 1 1
4 - 1 0 0
2 - 0 1 0
4 - 1 0 0
4 - 1 0 0
2 - 0 1 0
4 - 1 0 0
4 - 1 0 0
----------
- 5 4 0
在这里n为9,因此n / 2 = 4,并且从右起的第3位满足count> 4,因此在多数元素中设置,其他所有位均未设置。
因此,我们的多数元素是1 0 0,即4
但是还有更多,当数组中存在多数元素时,这种方法就可以工作。如果不存在怎么办?
让我们借助此示例进行查看:
Input : {3, 3, 6, 2, 4, 4, 2, 4}
Binary representation of the same are:
3 - 0 1 1
3 - 0 1 1
6 - 1 1 0
2 - 0 1 0
4 - 1 0 0
4 - 1 0 0
2 - 0 1 0
4 - 1 0 0
----------
- 4 5 0
在这里n为8,因此n / 2 = 4,并且右数第二位满足count> 4,因此应在多数元素中将其设置为1,而所有其他位均未设置。
因此,据此我们的多数元素为0 1 0,即2,但实际上多数元素不在数组中。因此,我们还要对数组进行一次遍历,以确保此元素出现的次数超过n / 2次。
这是以上想法的实现
C++
#include
using namespace std;
void findMajority(int arr[], int n)
{
// Number of bits in the integer
int len = sizeof(int) * 8;
// Variable to calculate majority element
int number = 0;
// Loop to iterate through all the bits of number
for (int i = 0; i < len; i++) {
int count = 0;
// Loop to iterate through all elements in array
// to count the total set bit
// at position i from right
for (int j = 0; j < n; j++) {
if (arr[j] & (1 << i))
count++;
}
// If the total set bits exceeds n/2,
// this bit should be present in majority Element.
if (count > (n / 2))
number += (1 << i);
}
int count = 0;
// iterate through array get
// the count of candidate majority element
for (int i = 0; i < n; i++)
if (arr[i] == number)
count++;
// Verify if the count exceeds n/2
if (count > (n / 2))
cout << number;
else
cout << "Majority Element Not Present";
}
// Driver Program
int main()
{
int arr[] = { 3, 3, 4, 2, 4, 4, 2, 4, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
findMajority(arr, n);
return 0;
}
Java
class GFG
{
static void findMajority(int arr[], int n)
{
// Number of bits in the integer
int len = 32;
// Variable to calculate majority element
int number = 0;
// Loop to iterate through all the bits of number
for (int i = 0; i < len; i++)
{
int count = 0;
// Loop to iterate through all elements in array
// to count the total set bit
// at position i from right
for (int j = 0; j < n; j++)
{
if ((arr[j] & (1 << i)) != 0)
count++;
}
// If the total set bits exceeds n/2,
// this bit should be present in majority Element.
if (count > (n / 2))
number += (1 << i);
}
int count = 0;
// iterate through array get
// the count of candidate majority element
for (int i = 0; i < n; i++)
if (arr[i] == number)
count++;
// Verify if the count exceeds n/2
if (count > (n / 2))
System.out.println(number);
else
System.out.println("Majority Element Not Present");
}
// Driver Code
public static void main (String[] args)
{
int arr[] = { 3, 3, 4, 2, 4, 4, 2, 4, 4 };
int n = arr.length;
findMajority(arr, n);
}
}
// This code is contributed by AnkitRai01
Python3
def findMajority(arr, n):
# Number of bits in the integer
Len = 32
# Variable to calculate majority element
number = 0
# Loop to iterate through
# all the bits of number
for i in range(Len):
count = 0
# Loop to iterate through all elements
# in array to count the total set bit
# at position i from right
for j in range(n):
if (arr[j] & (1 << i)):
count += 1
# If the total set bits exceeds n/2,
# this bit should be present in
# majority Element.
if (count > (n // 2)):
number += (1 << i)
count = 0
# iterate through array get
# the count of candidate majority element
for i in range(n):
if (arr[i] == number):
count += 1
# Verify if the count exceeds n/2
if (count > (n // 2)):
print(number)
else:
print("Majority Element Not Present")
# Driver Code
arr = [3, 3, 4, 2, 4, 4, 2, 4, 4]
n = len(arr)
findMajority(arr, n)
# This code is contributed by Mohit Kumar
C#
using System;
class GFG
{
static void findMajority(int []arr, int n)
{
// Number of bits in the integer
int len = 32;
// Variable to calculate majority element
int number = 0;
// Loop to iterate through all the bits of number
for (int i = 0; i < len; i++)
{
int countt = 0;
// Loop to iterate through all elements
// in array to count the total set bit
// at position i from right
for (int j = 0; j < n; j++)
{
if ((arr[j] & (1 << i)) != 0)
countt++;
}
// If the total set bits exceeds n/2,
// this bit should be present in majority Element.
if (countt > (n / 2))
number += (1 << i);
}
int count = 0;
// iterate through array get
// the count of candidate majority element
for (int i = 0; i < n; i++)
if (arr[i] == number)
count++;
// Verify if the count exceeds n/2
if (count > (n / 2))
Console.Write(number);
else
Console.Write("Majority Element Not Present");
}
// Driver Code
static public void Main ()
{
int []arr = { 3, 3, 4, 2, 4, 4, 2, 4, 4 };
int n = arr.Length;
findMajority(arr, n);
}
}
// This code is contributed by @Tushi..
输出:
4
时间复杂度:O(N)
空间复杂度:O(1)