剑指 Offer 39. 数组中出现次数超过一半的数字

剑指 Offer 39. 数组中出现次数超过一半的数字

参考:> https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/solution/mian-shi-ti-39-shu-zu-zhong-chu-xian-ci-shu-chao-3/

思路

1.比较容易想到的,哈希表
2.排序数组,输出中位数
3.摩尔投票法
初始化vote=0
众数x
比较难想,简而言之就是假设第一个数是众数,x=nums[0],vote加一。
后面依次遍历:

nums[i]==x, vote++; 
nums[i]!=x, vote--;

每次vote==0时,更新x:x=nums[i]
最后一轮的x就是众数

代码

1.哈希表

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        if(nums.size()==1)
            return nums[0];
        int len=nums.size()/2+1;
        map<int,int> hash;
        for(int i=0;i<nums.size();i++)
        {
            if(hash[nums[i]]==0)
            {
                hash[nums[i]]=1;
            }else
            {
                hash[nums[i]]++;
                if(hash[nums[i]]==len)
                {
                    return nums[i];

                }
            }
        }
        return 0;
    }
};

2.排序输出中位数

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        if(nums.size()==1)
            return nums[0];
        int len=nums.size()/2;
        sort(nums.begin(),nums.end());
        return nums[len];
    }
};

3.摩尔投票

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int vote=0;
        int x;
        for(int i=0;i<nums.size();i++)
        {
            if(vote==0)
                x=nums[i];
            
            vote+=nums[i]==x?1:-1;
            
            //cout<<vote<<endl;
        }
        return x;
    }
};

时间对比

posted @ 2020-10-22 15:57  韩天尊  阅读(68)  评论(0)    收藏  举报