题目链接:https://leetcode.com/problems/majority-element/
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
一般解法
- 先对数组排序,然后取中间位置的元素,再对数据扫描一趟来判断此元素是否为多数元素。时间复杂度O(nlog(n)),空间复杂度O(1)。
- 使用一个hash表,对数组进行一趟扫描统计每个元素出现的次数,即可得到多数元素。时间复杂度O(n),空间复杂度O(n)。
Boyer-Moore 算法
该算法时间复杂度为O(n),空间复杂度为O(1),只需通过一遍扫描,就可以确定多数的值。
具体做法就是相互抵消,一个值占据一半以上的票数,那么它一定会被保存到最后。无论中间被消除多少次。
maj可以初始化为任何值。count初始化为1.
AC:
class Solution {
public int majorityElement(int[] nums) {
int count=0,maj=0;
for(int num:nums){
if(count==0)
maj=num;
if(num!=maj)
count--;
else
count++;
}
return maj;
}
}