目录
方法一:哈希
我们可以用一个存储<数字,出现次数>的哈希表来判断某个数字是否出现了一半的次数以上。
首先遍历一遍出次数,然后遍历一遍求出出现次数超过一半的数。
代码如下所示:
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
unordered_map<int, int> mp;
for(const int n : numbers){
mp[n]++;
}
for(const int val : numbers){
if(mp[val]>numbers.size()/2){
return val;
}
}
return 0;
}
};
方法二:排序
由于这个数字出现次数超过了一半,所以我们将其排序,之后再取中位数即可。
代码如下所示:
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
sort(numbers.begin(), numbers.end());
// int cond=numbers[numbers.size()/2];
// int cnt=0;
// for(const int k : numbers){
// if(cond==k) cnt++;
// }
// if(cnt > numbers.size()/2) return cond;
// return 0;
return numbers[numbers.size()/2];
}
};
由于题目保证有解,所以我们排序之后直接返回中位数即可,如果没有保证可解,还需要遍历一遍数组看出现次数是否超过了一半。
O(nlogn)的时间复杂度
方法三:候选
这个方法挺玄乎的,就是拿众数和其他数字一直去抵消,最后剩下的那个数字就是我们要找的出现次数超过一半的数字。
代码如下所示:
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int cond=-1;
int cnt=0;
for(int i=0;i<numbers.size();++i){
if(cnt==0){
cond=numbers[i];
++cnt;
}else{
if(cond==numbers[i]){
++cnt;
}else{
--cnt;
}
}
}
return cond;
}
};