https://leetcode-cn.com/problems/majority-element/
解法一
最容易想到的解法,用哈希表存下每个元素出现的次数,当次数超过n/2
时,找到答案,算法效率也高,复杂度均为
O
(
n
)
O(n)
O(n)。
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int, int> count;
for (auto i : nums) {
if (count.find(i) == count.end()) count[i] = 1;
else count[i]++;
if (count[i] > nums.size() / 2) return i;
}
return INT_MIN;
}
};
解法二
摩尔投票法
本文目的就是为了记录这个方法:candidate
变量代表当前的候选人,count
变量代表当前票数。遍历整个数组,当遍历到x时:
- 如果
count == 0
,将x赋值给candidate
- 如果
x == candidate
,count++
;否则count--
。这一条保证count >= 0
。
这个算法基于这样一个事实:当数组中众数的数量超过总数的一半时,每次把两个不同的元素删除,最终剩下的一定是那个众数。
class Solution {
public:
int majorityElement(vector<int>& nums) {
int candidate = -1, count = 0;
for (auto x : nums) {
if (!count) candidate = x;
if (x == candidate) count++;
else count--;
}
return candidate;
}
};
复杂度分别为 O ( n ) O(n) O(n)和 O ( 1 ) O(1) O(1)。