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)。
这篇博客介绍了LeetCode第169题Majority Element的两种解法。解法一是使用哈希表统计元素出现次数,当次数过半则为答案,复杂度为O(n)。解法二是摩尔投票法,通过两个变量跟踪候选元素和票数,保证每次消除不同元素,最后留下的即为众数,时间复杂度为O(n),空间复杂度为O(1)。
547

被折叠的 条评论
为什么被折叠?



