[Lc]面试题39数组中出现次数超过一半的数字
Contents
题目
题解
详细注释见169题,这里再练习一下
1. 排序取中法
- 时间复杂度$O(nlog{n})$,主要是排序耗费的
- 空间复杂度$O(1)$
class Solution {//三种方法,这是1.排序后取中间数
//时间复杂度O(nlogn),主要是排序消耗时间
public:
int majorityElement(vector<int>& nums) {
sort(nums.begin(),nums.end());
return nums[nums.size()/2];
}
};
2. 摩尔投票法
最佳方法。利用本题大于n/2的性质,
- 先假定当前数位众数,
- 若遇到这个数(包括自身)则计数值+1,遇到不同的数计数值-1。
- 当计数值==0的时候更改当前的假定众数,为现在遍历的数
- 返回最后的众数值
- 时间复杂度$O(n)$
- 空间复杂度$O(1)$
class Solution {
public:
int majorityElement(vector<int>& nums) {//三种方法。2. 摩尔投票法
int res=0;
int count = 0;
for(auto num:nums){
if(count==0) res = num;
if(res==num)count++;
else count--;
}
return res;
}
};
3. 哈希表法
记录每个数的个数,遇到大于一半地直接返回
- 时间复杂度$O(n)$
- 空间复杂度$O(n)$
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int,int> m;
for(auto num:nums){
if(m.count(num)) m[num]++;
else m[num]=1;
if(m[num]>nums.size()/2) return num;
}
return -1;
}
};
Author ChrisHRZ
LastMod 2020-05-20