【229中等】求众数(2021.10.22)
1. 问题描述
给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋
次的元素。
示例 1:
输入:[3,2,3]
输出:[3]
示例 2:
输入:nums = [1]
输出:[1]
示例 3:
输入:[1,1,1,3,3,2,2,2]
输出:[1,2]
提示:
1 <= nums.length <= 5 * 104
-109 <= nums[i] <= 109
2. 思路
-
使用map来进行计数
-
这个问题中对摩尔投票法进行扩展,数组中出现次数大于n/3的元素最多有两个。
3. 代码
- 使用map
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
map<int, int> m;
int n = nums.size();
int count = n / 3;
vector<int> result;
for (int i = 0; i < n; i++) {
m[nums[i]] += 1;
}
for (auto item: m) {
if (item.second > count) {
result.push_back(item.first);
}
}
return result;
}
};
- 使用摩尔投票法
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
vector<int> result;
int count1 = 0, count2 = 0;
int majority1 = -1, majority2 = -1;
for (auto num : nums) {
if ((count1 == 0 || num == majority1) && num != majority2) {
majority1 = num;
count1++;
} else if (count2 == 0 || num == majority2) {
majority2 = num;
count2++;
} else {
count1--;
count2--;
}
}
int counter1 = 0, counter2 = 0;
for (auto num : nums) {
if (num == majority1) {
counter1++;
} else if (num == majority2) {
counter2++;
}
}
if (counter1 > nums.size() / 3) {
result.push_back(majority1);
}
if (counter2 > nums.size() / 3) {
result.push_back(majority2);
}
return result;
}
};
4. 复杂度
时间复杂度均为: O ( n ) O(n) O(n)
摩尔投票法空间复杂度: O ( 1 ) O(1) O(1)