169. 多数元素 - 力扣(LeetCode)

题目描述

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2

题解1

用unordered_map统计每个元素出现的次数,最后输出出现最多的元素即可。

代码1

/*
用unordered_map统计每个数字出现的次数
时间复杂度为:O(n)

*/
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        unordered_map<int, int>myMap;
        int cnt = 0, res = 0;
        for(auto num:nums){
            if(myMap.find(num) == myMap.end()){
                myMap[num] = 1;
            }
            else{
                ++myMap[num];
            }
            if(myMap[num] > cnt){
                cnt = myMap[num];
                res = num;
            }
        }
        return res;
    }
};

执行结果1

执行结果1

题解2

根据多数元素出现的次数大于n/2且超过其它元素出现次数之和这一特点,进行统计。
遇到与当前元素res相同的,个数加一,否则个数减一。当个数为0,当前元素res更新为下一个元素。

代码2

/*
根据多数元素出现的次数大于n/2且超过其它元素出现次数之和这一特点,进行统计

时间复杂度为:O(n)
空间复杂度为:O(1)
*/
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int cnt = 0, res = 0;//cnt表示的是多数元素比其它元素之和多的个数  res就是多数元素
        for(auto num:nums){
            if(cnt == 0){
                res = num;
                cnt = 1;
            }
            else{
                if(num == res){//相同数目+1
                    ++cnt;
                }
                else{//不同的减1
                    --cnt;
                }
            }
        }
        return res;
    }
};

执行结果2

执行结果

发布了152 篇原创文章 · 获赞 29 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/happyeveryday62/article/details/103696871