【简单】面试题 17.10. 主要元素(摩尔投票法/多数投票法)

【题目】
数组中占比超过一半的元素称之为主要元素,给定一个整数数组,找到它的主要元素,若没有,返回-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;
    }
};

你可能感兴趣的:(刷题,#,leetcode)