解1:
【用哈希表】
class Solution {
public int majorityElement(int[] nums) {
int n=nums.length;
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
if(map.get(nums[i])>n/2) return nums[i];
}
return -1;
}
}
解2:
【摩尔投票】
参考:
链接:https://leetcode-cn.com/problems/find-majority-element-lcci/solution/gong-shui-san-xie-yi-ti-shuang-jie-ha-xi-zkht/
在集合中寻找可能存在的多数元素,这一元素在输入的序列重复出现并占到了序列元素的一半以上;在第一遍遍历之后应该再进行一个遍历以统计第一次算法遍历的结果出现次数,确定其是否为众数;如果一个序列中没有占到多数的元素,那么第一次的结果就可能是无效的随机元素。
class Solution {
public int majorityElement(int[] nums) {
int n=nums.length;
int cnt=0;
int x=-1;
for(int i:nums){
if(cnt==0){
x=i;
cnt=1;
}
else{
cnt+=x==i?1:-1;
}
}
cnt=0;
for(int i:nums){
if(i==x) cnt+=1;
}
return cnt>n/2?x:-1;
}
}
再进行一次遍历的原因:检查这个「可能」的主要元素 xx 的出现次数是否超过总数一半
防止类似 【1,1,2,2,3】这样的情况出现。