LeetCode 229 Majority Element II(主要元素II)(Array)(Boyer–Moore majority vote algorithm)
Posted nomasp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 229 Majority Element II(主要元素II)(Array)(Boyer–Moore majority vote algorithm)相关的知识,希望对你有一定的参考价值。
原文
给定一个长度为n的整型数组,找出所有出现超过 ⌊ n/3 ⌋ 次的元素。算法应该运行在线性时间上,且进用 O(1) 空间。
提示:
它可能有多少个主要元素?
原文
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.
Hint:
How many majority elements could it possibly have?
分析
The Boyer-Moore Vote Algorithm solves the majority vote problem in linear time O(n) and logarithmic space O(logn) . 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.
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));
代码
Java
public class Solution
public List<Integer> majorityElement(int[] nums)
List<Integer> marjority = new ArrayList<>();
int n = nums.length;
int candidate1 = 0, candidate2 = 0, counter1 = 0, counter2 = 0;
for (int i : nums)
if (candidate1 == i)
counter1++;
else if (candidate2 == i)
counter2++;
else if (counter1 == 0)
candidate1 = i;
counter1 = 1;
else if (counter2 == 0)
candidate2 = i;
counter2 = 1;
else
counter1--;
counter2--;
counter1 = 0;
counter2 = 0;
for (int i : nums)
if (i == candidate1) counter1++;
else if (i == candidate2) counter2++;
if (counter1 > n/3) marjority.add(candidate1);
if (counter2 > n/3) marjority.add(candidate2);
return marjority;
以上是关于LeetCode 229 Majority Element II(主要元素II)(Array)(Boyer–Moore majority vote algorithm)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode OJ 229. Majority Element II
Leetcode # 169, 229 Majority Element I and II
[LeetCode] 229. Majority Element II 多数元素 II
LeetCode 229. Majority Element II (众数之二)
LeetCode 229 Majority Element II(主要元素II)(Array)(Boyer–Moore majority vote algorithm)