169. Majority Element
题目描述
找出n个数中出现n/2次的数
思路
用 map 记录每个数出现的次数,超过 n/2+n%2 次的就 return
官方解法
- 哈希表
时间复杂度 O(n)
空间复杂度 O(n)
c++代码
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int, int> counts;
int majority = 0, cnt = 0;
for (int num: nums) {
++counts[num];
if (counts[num] > cnt) {
majority = num;
cnt = counts[num];
}
}
return majority;
}
};
2. 排序 先排序,排序后下标为 n/2 的元素就是众数 时间复杂度 O(nlogn) 空间复杂度 O(logn)
3. 随机化 随机挑选一个下标对应的元素并验证 期望的时间复杂度为 O(n) 空间复杂度O(1)
4. 分治 将数组分成左右两部分,分别求出左半部分的众数 a1 以及右半部分的众数 a2,随后在 a1 和 a2 中选出正确的众数。 时间复杂度 O(nlogn) 空间复杂度 O(logn)
5. Boyer-Moore 投票算法 如果我们把众数记为 +1,把其他数记为 −1,将它们全部加起来,显然和大于 0,从结果本身我们可以看出众数比其他数多。 出现一次别的数就抵消掉一个众数,这样最后还是会留下的是众数。 时间复杂度 O(n) 空间复杂复 O(1) c++代码
class Solution {
public:
int majorityElement(vector<int>& nums) {
int candidate = -1;
int count = 0;
for (int num : nums) {
if (num == candidate)
++count;
else if (--count < 0) {
candidate = num;
count = 1;
}
}
return candidate;
}
};