0
点赞
收藏
分享

微信扫一扫

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

眸晓 2022-01-20 阅读 56

题目描述:

分析:

这道题比较简单,设立一个hash表,来存储数字和他出现的次数,然后对nums数组遍历一遍,如果该数字没有出现过,加入hash表,如果该数字出现过,则给他出现的次数+1,并判断出现的次数是否大于数组长度的一半,如果大于数组长度的一半 ,则返回该数字即可。

代码如下:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        // 数组中只有一个元素,直接返回即可
        if(nums.size()==1)
        return nums[0];
        unordered_map<int,int> map;
        for(int i=0;i<nums.size();i++)
        {
            // 如果这个数字已经在hash表中
            if(map.find(nums[i])!=map.end())
            {
                // 次数+1
                map[nums[i]]++;
                // 如果出现次数大于数字长度一半,直接返回该数字即可
                if(map[nums[i]]>(nums.size()/2))
                return nums[i];
            }
            else
                // 如果没有出现该数字,加入hash表
                map.insert(make_pair(nums[i],1));
        }
        return 0;
    }
};

想看看题解有没有什么新奇方法,K神果然不负众望,又学会了一种摩尔投票法

思路:

 

然后写代码:

 

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int count=0;
        int zs;
        for(int i=0;i<nums.size();i++)
        {
            // 第一次或者之前的count抵消为0,选取新的众数
            if(count==0)
            {
                count++;
                zs=nums[i];
                continue;
            }
            // 如果众数的count>0
            if(count>0)
            {
                // 如果当前遇到的还是众数,则count++
                if(nums[i]==zs)
                count++;
                // 如果遇到的不是众数,则count--
                else
                count--;
            }
           
        }
        return zs;
    }
};
举报

相关推荐

0 条评论