题目:多数元素

解法一(哈希表):

第一次遍历将数组中的元素存入哈希表,nums自身的数值作为键,出现次数作为值

之后再通过一次遍历找出表中值大于n/2对应的键,作为 _多数元素 _返回

 1int majorityElement(vector<int>& nums)
 2    {
 3        int sz = nums.size();
 4        int res;
 5        std::unordered_map<int, int> um;
 6        for(int i = 0; i < sz; i++)
 7        {
 8            if(um.find(nums[i]) == um.end())
 9                um[nums[i]] = 1;
10            else
11                um[nums[i]]++;
12        }
13        for(auto num : nums)
14        {
15            if(um[num] > static_cast<float>(sz / 2))
16                res = num;
17        }
18        return res;
19    }

解法二:

这里借用一下灵神的比喻:169. 多数元素 - 力扣(LeetCode)

用「擂台赛」打比方:

想象一众武林高手比武,谁会笑到最后?

擂主登场:nums[0] 成为初始擂主,生命值为 1。

挑战者出现:遍历后续元素,作为挑战者。

比武:如果挑战者与擂主属于同一门派(值相同),那么擂主生命值加 1,否则擂主生命值减 1。

擂主更迭:如果比武后,擂主生命值降为 0(同归于尽),那么下一个挑战者成为新的擂主,生命值为 1。

最后在擂台上的那人,便是武林盟主(绝对众数)。

 1int majorityElement(vector<int>& nums)
 2{
 3    int res = 0, hp = 0;
 4    for(int x : nums)
 5    {
 6        if(hp == 0)
 7        {
 8            res = x;
 9            hp = 1;
10        }
11        else
12            hp += res == x ? 1 : -1;
13    }
14    return res;
15}