# 问题描述：

1. The majority vote problem is to determine in any given sequence of choices whether there is a choice with more occurrences than half of the total number of choices in the sequence and if so, to determine this choice. Note how this definition contrasts with the mode in which it is not simply the choice with the most occurrences, but the number of occurrences relative to the total length of the sequence. Mathematically, given a finite sequence (length n) of numbers, the object is to find the majority number defined as the number that appears more than ⌊ n/2 ⌋ times.

2. Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

# 算法描述：

The algorithm is carried out in two steps:

1. Eliminate all elements except one.
Iterating through the array of numbers, maintain a current candidate and a counter initialized to 0. With the current element x in iteration, update the counter and (possibly) the candidate: if the counter is 0, set the current candidate to x and the counter to 1. If the counter is not 0, increment or decrement the counter based on whether x is the current candidate.
2. Determine if the remaining element is a valid majority element.
With the candidate acquired in step 1, iterate through the array of numbers and count its occurrences. Determine if the result is more than half of the sequence's length. If so, the candidate is the majority. Otherwise, the sequence doesn't contain a majority.

Note that the counter can be a maximum of {\displaystyle n} which requires {\displaystyle O(\log n)} space. In practice, however, a constant number of bits should suffice as a {\displaystyle 128} bit counter can go upto {\displaystyle 2^{128}} which is large enough for any practical computation. The time complexity remains {\displaystyle O(n)}, even considering the amount of time it takes to increment the counter because it can be incremented in constant amortized time.

# 算法实现：

1. Given a finite sequence (length n) of numbers, the object is to find the majority number defined as the number that appears more than ⌊ n/2 ⌋ times.

import java.util.*;
public class MajorityVote {
public int majorityElement(int[] num) {
int n = num.length;
int candidate = num[0], counter = 0;
for (int i : num) {
if (counter == 0) {
candidate = i;
counter = 1;
} else if (candidate == i) {
counter++;
} else {
counter--;
}
}

counter = 0;
for (int i : num) {
if (i == candidate) counter++;
}
if (counter <= n / 2) return -1;
return candidate;

}
public static void main(String[] args) {
MajorityVote s = new MajorityVote();
System.out.format("%d\n", s.majorityElement(new int[] {1, 2, 3}));
System.out.format("%d\n", s.majorityElement(new int[] {2, 2, 3}));
}
}

2. Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

public class Solution {
public List<Integer> majorityElement(int[] nums) {
int num1 = 0, num2 = 1;
int count1 = 0, count2 = 0;
for(int num: nums) {
if (count1 == 0) {
num1 = num;
count1 = 1;
} else if (num1 == num) {
count1 ++;
} else if (count2 == 0) {
num2 = num;
count2 = 1;
} else if (num2 == num) {
count2 ++;
} else {
count1 --;
count2 --;
if (count1 == 0 && count2 > 0) {
num1 = num2;
count1 = count2;
num2 = 0;
count2 = 0;
}
}
}
if (count1 > 0) {
count1 = 0;
for(int num: nums) if (num1 == num) count1 ++;
}
if (count2 > 0) {
count2 = 0;
for(int num: nums) if (num2 == num) count2 ++;
}
List<Integer> results = new ArrayList<>();
return results;
}
}

# Reference：

1. https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_majority_vote_algorithm

2. Moore的主页上有这个算法的介绍：A Linear Time Majority Vote Algorithm 和 这个算法的一个简单示例演示，链接如下：

http://www.cs.utexas.edu/~moore/best-ideas/mjrty/index.html

3. https://leetcode.com/problems/majority-element-ii/

• 本文已收录于以下专栏：

## 1011: [HNOI2008]遥远的行星

• Mmh2000
• 2017年04月23日 15:01
• 82

## LeetCode 229 Majority Element II（主要元素II）（Array）（Boyer–Moore majority vote algorithm）

• NoMasp
• 2016年08月29日 21:40
• 1417

## Boyer-Moore Majority Vote Algorithm的更一般性问题

1) 问题描述基本问题：对于一个给定数组A[0:n-1],找出出现次数大于⌊n/2⌋\lfloor n/2\rfloor 的元素，称为Majority element. 一般问题：对于一个给定数组A...
• isunn
• 2016年02月25日 11:32
• 747

## Leetcode 169 - Majority Element（Moore投票算法）

• Lzedo
• 2017年02月15日 22:03
• 115

举报原因： 您举报文章：摩尔投票算法（Boyer–Moore majority vote algorithm） 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)