数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-majority-element-lcci
输入:[1,2,5,9,5,9,5,5,5]
输出:5
法一:hash统计
public int majorityElement(int[] nums) {
int len=nums.length;
Map<Integer,Integer> map=new HashMap<>();
for (int i = 0; i < len; i++) {
map.put(nums[i],map.getOrDefault(nums[i],0 )+1 );
if(map.get(nums[i])>len/2){
return nums[i];
}
}
return -1;
}
法二:摩尔投票
public int majorityElement(int[] nums) {
int n=nums.length;
int x=-1,cnt=0;
for(int i:nums){
if(cnt==0){
x=i;
cnt=1;
}else {
cnt+=x==i?1:-1;
}
}
cnt=0;
for (int i = 0; i < n; i++) {
if(x==nums[i]){
cnt++;
}
}
return cnt>n/2?x:-1;
}
每次将两个不同的元素进行「抵消」,如果最后有元素剩余,则「可能」为元素个数大于总数一半的那个。
为什么说是可能呢,因为抵消到最后,可能会有捡漏情况存在,出现在最后,只出现一次却成功的留到了最后。
因此需要再进行一次遍历,检查这个「可能」的主要元素 xx 的出现次数是否超过总数一半。