本文概述
- C ++
- Java
- Python3
- C#
给定大小为N的数组, 找到多数元素。多数元素是在给定数组中出现n/2次以上的元素。
例子:
Input: {3, 3, 4, 2, 4, 4, 2, 4, 4}
Output: 4Input: {3, 3, 6, 2, 4, 4, 2, 4}
Output: No Majority Element
方法:
在这篇文章中, 我们借助于数组中存在的数字的二进制表示来解决该问题。
任务是找到出现次数超过n/2次的元素。因此, 它看起来比所有其他数字的总和还多。
【算法题(查找多数元素|S3(位魔术))】因此, 我们从数组每个数字的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 <
iostream>
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)
推荐阅读
- GOCC18(2020年Google在线编码挑战赛-新毕业生(印度))
- 8051和AVR之间有哪些区别()
- Python从给定列表中删除重复的子列表
- 8051和PIC之间有什么区别()
- TCS Codevita面试体验2020(数字优惠)
- 如何使用正则表达式验证CVV数字
- Win7系统局域网共享设置处理方案
- 输入法图标不见了怎样办?
- Windows 7下游戏画面扁平处理办法