Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋
times.
You may assume that the array is non-empty and the majority element always exist in the array.
Example 1:
Input: [3,2,3]
Output: 3
Example 2:
Input: [2,2,1,1,1,2,2]
Output: 2
The sorting solution or O(N) space solution using hash map is trivial. There is another O(N) algorithm called Boyer-Moore Majority Vote algorithm that only uses O(1) space. We need two passes over the input array. In the 1st pass, we generate a single candidate value which is the majority value if there is a majority. The 2nd pass simply counts the frequency of that value to confirm.
In the 1st pass, we need 2 values: a candidate value, initially set to any value; a count, initially set to 0. Then for each element, do the following.
1. if current element == candidate, count++;
2. else if current element != candidate: if count is 0, set current element as the new candidate and count to 1; if count is > 0, count--;
Proof of correctness:
1. if we first pick a majority number as candidate, then say after consuming k numbers its count is decreased to 0, this means we've consumed k / 2 majority numbers and k / 2 non-majority numbers. The remaining array has > n / 2 - k / 2 majority numbers and < n - k - n / 2 + k / 2 = n / 2 - k / 2 non-majority numbers. The majority number is still the majority number.
2. if we first pick a non-majority number C as candidate, then say after consuming k numbers its count is decreased to 0, we've consumed at most k / 2 majority numbers to de-throne C's candidancy. This means the remaining array has > n / 2 - k / 2 majority numbers and < n - k - n / 2 + k / 2 = n / 2 - k / 2 non-majority numbers. Exactly the same with case 1.
For a more detailed explanation, refer to Majority Voting Algorithm.
class Solution { public int majorityElement(int[] nums) { int candidate = nums[0], cnt = 1; for(int i = 1; i < nums.length; i++) { if(nums[i] == candidate) { cnt++; } else { if(cnt == 0) { candidate = nums[i]; cnt = 1; } else { cnt--; } } } // cnt = 0; // for(int i = 0; i < nums.length; i++) { // if(nums[i] == candidate) { // cnt++; // } // } // return cnt > nums.length / 2 ? candidate : -1; return candidate; } }
Related Problems
Single Number
Single Number II
Single Number III