【题目】
数组中占比超过一半的元素称之为主要元素,给定一个整数数组,找到它的主要元素,若没有,返回-1。
来源:leetcode
链接:https://leetcode-cn.com/problems/find-majority-element-lcci/
【示例】
输入:[1,2,5,9,5,9,5,5,5]
输出:5
【示例2】
输入:[3,2]
输出:-1
【示例3】
输入:[2,2,1,1,1,2,2]
输出:2
【代码】常规法
class Solution {
public:
map<int,int> m;
int majorityElement(vector<int>& nums) {
int len=nums.size()/2+1;
for(auto x:nums){
m[x]++;
if(m[x]>=len)
return x;
}
return -1;
}
};
【摩尔投票法(多数投票法)】用于解决在无序多个候选人中选择票数最多的那个。cnt用来记录major主要元素的票数,当cnt为0票的时候,表示候选人为空,使major等于新元素,当cnt非0时,若新元素和major相同则使cnt++,否则,cnt–
例如数组[1,1,2,3,1]
step1:新元素:1;cnt=1 major=1
step2:新元素:1;cnt++ cnt=2 major=1
step3:新元素:2;cnt-- cnt=1 major=1
step4:新元素:3;cnt-- cnt=0 major=1
step5:新元素:1;cnt++ cnt=1 major=1
class Solution {
public:
int majorityElement(vector<int>& nums) {
int major=nums[0],cnt=1,len=nums.size();
for(int i=1;i<len;i++)
if(!cnt||major==nums[i]){
major=nums[i];
cnt++;
}else
cnt--;
int n=0;
for(auto x:nums)
if(x==major)
n++;
return n>=len/2+1?major:-1;
}
};