leetcode 算法-求众数
题目
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
解题思路
本题是求数组中出现次数大于一半的元素。一个基本想法就是用一个map存储每个元素的出现次数,然后返回次数最多的那个对应的元素。
这种方法时间复杂度和空间复杂度都是
O
(
n
)
O(n)
O(n),不是很好。
这里我们要介绍的是一种叫做摩尔投票法的方法,由于众数出现次数大于数组长度的一半,因此我们每次从这个数组中消除一对值不同的元素,最终剩下的元素就一定是众数。因为众数出现次数大于一半,所以说一定不会被消除完。
基于这个思想我们就可以设计出本题的算法。
首先设数组为nums,用变量majority存储众数,count存储majority的出现次数。
如果count==0,则把当前遍历元素赋值给majority,然后count赋值为1;
如果nums[i]==majority时,count++;
否则,count–;//这里相当于消除不同的过程
最终返回majority即可。
代码
class Solution {
public int majorityElement(int[] nums) {
int majority = 0,count=0;
for (int i = 0,len=nums.length; i <len; i++) {
if(count==0){
majority=nums[i];
count=1;
}else if(nums[i]==majority){
count++;
}else {
count--;
}
}
return majority;
}
}