📜  查找多数元素|套装3(位魔术)

📅  最后修改于: 2021-05-25 06:37:57             🧑  作者: Mango

先决条件:多数元素,多数元素|设置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..


Javascript


输出:
4

时间复杂度:O(N)
空间复杂度:O(1)