Majority Element

Updated on 09 June, 2025
Majority Element header image

Problem Statement

The task requires identifying the majority element within an array nums, where the majority element is defined as the one that appears more than ⌊n / 2⌋ times in the array (n being the size of the array). The condition given assures us that a majority element always exists. The definition of the array's majority element pivots on its frequent appearance. Essentially, this element appears in the array more frequently than all the other elements combined, occurring in more than half of the array's total entries.

Examples

Example 1

Input:

nums = [3,2,3]

Output:

3

Example 2

Input:

nums = [2,2,1,1,1,2,2]

Output:

2

Constraints

  • n == nums.length
  • 1 <= n <= 5 * 104
  • -109 <= nums[i] <= 109

Approach and Intuition

To determine the majority element in the given examples, let's break down the steps that could be intuitively used, seen from the example inputs and outputs provided:

  1. Direct Observation: Simply by looking at the arrays for majority counts:
    • For [3, 2, 3], number 3 appears 2 times in an array of length 3, which is more than ⌊3/2⌋ = 1. Hence, 3 is the majority element.
    • In [2, 2, 1, 1, 1, 2, 2], 2 appears 4 times out of an array of length 7, which is more than ⌊7/2⌋ = 3. Thus, 2 is the majority element.
  • Frequency Calculation: Considering a straightforward method, we could maintain a frequency count for each element and return the one that has a count greater than ⌊n / 2⌋.

    • Count each element’s frequency.
    • Traverse through the count and return the element with the highest frequency that also satisfies the more than half condition.
  • Constraints Overview:

    • Array size constraints ensure that naive methods (like counting frequencies for every element) are feasible for small n but might introduce performance issues when n reaches its upper limit (50,000). Thus, more efficient algorithms (like Boyer-Moore Voting Algorithm) might be considered in those cases, which operate in linear time and constant space.
    • Value constraints are wide (-109 to 109), indicating a solution should accurately manage potential integer overflow or discrepancies in negative and positive majority scenarios.

From the overview, this problem can be tackled using various approaches such as hashing (using a map to count occurrences), sorting and picking the middle element (since the majority element would dominate the sorted median), or optimal divide-and-conquer methods that split the array and count majorities in halves. However, specific constraints direct the need for more efficient linear time solutions.

Solutions

  • C++
  • Java
  • C
  • JavaScript
  • Python
cpp
class Solution {
public:
    int findMajority(vector<int>& elements) {
        int tally = 0;
        int majorElement;

        for (int& element : elements) {
            if (tally == 0) {
                majorElement = element;
            }
            tally += (element == majorElement) ? 1 : -1;
        }

        return majorElement;
    }
};

The provided C++ code defines a solution class with a function findMajority designed to find the majority element in a vector of integers. This function utilizes the Boyer-Moore voting algorithm, which efficiently determines the element that occurs more than n/2 times in the vector, where n is the size of the vector.

Here’s a high-level breakdown of how this algorithm functions in the code:

  • Initialize tally to zero. This acts as a counter to track the difference between the number of times majorElement has been encountered and times other elements have been encountered.
  • Initialize majorElement without a preset value. This variable will hold the candidate for the majority element.
  • Traverse through each element in the elements vector using a for loop.
    • If tally is zero, update majorElement to the current element.
    • Increment or decrement tally depending if the current element is the same as majorElement.
  • At the end of the loop, majorElement should hold the majority element since any majority would offset the count of all other elements.

Make sure to include the appropriate library if you are copying this code into a separate project:

  • #include <vector> to support the vector container use in the function argument.

This code's strength lies in its linear time complexity O(n) and constant extra space O(1), making it highly efficient for processing large datasets.

java
class Solution {
    public int findMajority(int[] elements) {
        int tally = 0;
        Integer major = null;

        for (int element : elements) {
            if (tally == 0) {
                major = element;
            }
            tally += (element == major) ? 1 : -1;
        }

        return major;
    }
}

The given Java solution addresses the problem of finding the majority element in an array. The method findMajority employs the Boyer-Moore Voting Algorithm, which is efficient for this purpose.

Follow the process outlined below to understand how the solution works:

  1. Initialize two variables: tally to keep track of the count and major to hold the potential majority element.
  2. Iterate through each element in the array:
    • If tally is zero, set the current element as the potential majority element (major).
    • Increase the tally by 1 if the current element is the same as major, otherwise decrease it by 1.
  3. By the end of the loop, major will contain the element that might be the majority in the array.

This method runs in linear time, making it highly efficient for large arrays. The use of the Boyer-Moore Voting Algorithm ensures that only a single pass through the data is necessary to find the majority element, if one exists.

c
int findMajority(int* array, int length) {
    int tally = 0;
    int leader = 0;

    for (int index = 0; index < length; index++) {
        if (tally == 0) {
            leader = array[index];
        }
        tally += (array[index] == leader) ? 1 : -1;
    }

    return leader;
}

This summary provides a guide on a function written in C to identify the majority element in an array. The function findMajority takes two parameters: a pointer to an integer array array and an integer length representing the size of the array.

The algorithm follows the Boyer-Moore voting principle. Here’s a breakdown of how it works:

  • Initialize two integers, tally to track the net number of times a candidate appears and leader to temporarily store the candidate for majority element. Start with tally at 0 and leader at the first element of the array.
  • Loop through each element of the array using a for loop.
  • If tally is zero, update the leader to the current element.
  • If the current array element is equal to leader, increment tally by 1. If not, decrement tally by 1.
  • After the loop completes, leader holds the value of the candidate that may be the majority element.

The approach ensures an efficient scan through the array, using O(n) time complexity and O(1) space complexity, where n is the number of elements in the array. This method is effective for finding a potential majority element but does not verify if the leader actually appears more than n/2 times. Additional checks might be necessary depending on the problem requirements.

js
var findMajority = function (elements) {
    let tally = 0;
    let major = null;

    for (let element of elements) {
        if (tally == 0) {
            major = element;
        }
        tally += element == major ? 1 : -1;
    }

    return major;
};

The provided JavaScript solution determines the majority element within an array by utilizing the Boyer-Moore Voting Algorithm. This algorithm efficiently finds the element that appears more than half the time in the array, commonly known as the majority element.

In essence, the algorithm maintains a counter (tally) to determine the potential majority element (major). As the array elements is iterated through:

  • When tally is zero, set the current element as the new potential majority element.
  • Increase tally by one if the current element equals the potential majority element. If it doesn't, decrease tally by one.

The final value of major at the conclusion of this process is the majority element because any element not in the majority would have resulted in decreasing the tally, effectively not allowing it to carry over as the majority element.

This approach is very efficient with a time complexity of O(n), making it suitable for large datasets. The space complexity is O(1) as it only uses two additional variables regardless of the input size.

To implement this solution in your code:

  • Define a function findMajority that takes an array elements.
  • Initialize tally to 0 and major to null.
  • Loop through each element of elements.
  • Adjust tally and major based on the above conditions.
  • Return major which should be the majority element if one exists. If no majority element exists, the function will return the last set major, which could be invalid, so further validation might be required depending on the problem constraints.
python
class Solution:
    def findMajority(self, elements):
        elem_count = 0
        majority = None

        for element in elements:
            if elem_count == 0:
                majority = element
            elem_count += 1 if element == majority else -1

        return majority

The provided Python code defines a class Solution with a method findMajority which is specifically designed to find the majority element in a given list, named elements. The majority element is defined as an element that appears more than n/2 times in the list, where n is the total number of elements in the list.

  • In the algorithm, two variables elem_count and majority are initialized. majority is used to keep track of the potential candidate for the majority element.
  • The program enters a loop iterating through each element in the provided list.
  • If elem_count is zero (meaning no candidate is currently considered or previous candidates have been invalidated), it sets the current element as the new candidate for a majority by assigning it to majority.
  • It then adjusts elem_count: incrementing it if the current element matches the current majority candidate, or decrementing it otherwise.
  • This adjustment essentially means that if the current element matches the suspected majority element, it gains a stronger position as a candidate; if it doesn’t, it weakens its position.
  • After processing all elements via the loop, the majority variable, which now holds the candidate that has not been fully invalidated, is returned as the majority element of the list.

In terms of robustness, note that this algorithm effectively identifies a majority element if there is one, using Boyer-Moore voting algorithm logic, which is efficient and works in linear time complexity O(n) with constant space complexity O(1).

Comments

No comments yet.