一、题目描述
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3] 输出: 3
示例 2:
输入: [2,2,1,1,1,2,2] 输出: 2
二、解题思路
方法一:由于题目要求众数一定存在,所以,可以先排序,在求n/2
中间的数 即可。但是排序的时间复杂度是优化后的快拍,所以还是O(nlogn)
方法二:使用计数器,如果第一个数与第二个数相等,则计数器加一;否则不相等,则计数器减一,最后剩下的数就是众数。遍历一遍即可,时间复杂度为O(n),空间复杂度为O(1);
三、可运行java代码
只有方法二的代码。
class Solution {
public int majorityElement(int[] nums) {
int res = nums[0];
int times = 1;
for(int i=1;i<nums.length;i++){
if(res == nums[i]){
times++;
}else{
times--;
if(times == 0){
res = nums[++i];
times++;
}
}
}
return res;
}
}