多数元素
题目描述
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例
示例1:
输入: [3,2,3]
输出: 3
示例2:
输入: [2,2,1,1,1,2,2]
输出: 2
思路
思路1:hash
使用hash表存储<num, numCount>数与数出现次数,如果数超过⌊ n/2 ⌋,则该数为众数
思路2: Boyer-Moore 投票算法
直接使用计数标记,记录好候选的最多元素,然后因为多数元素超过一半,所以可以不断使用count计数完成候选元素替换、增加、减小。
代码
思路2
public class Solution {
public int majorityElement(int[] nums){
int result = nums[0];
int count = 1;
for(int i = 1; i < nums.length; i++){
if (nums[i] == result){
count ++;
} else{
count --;
if (count == 0){
result = nums[i];
count = 1;
}
}
}
return result;
}
}
复杂度分析
时间复杂度
思路1和思路2都是n
空间复杂度
思路1会额外有n的字典,思路2不占用新的空间