题目描述
给定一个大小为 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
题解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;
}
};