169. 多数元素(C++题解含VS可运行源程序)
1.题解
1.1排序
- 我们可以先排序,然后输出在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。nums[n / 2]
- eg:奇数:n=5,⌊ n/2 ⌋=2,所以出现次数为3、4、5次,
- 排序后,第3个数肯定是多数元素;
- eg:偶数:n=6,⌊ n/2 ⌋=3,所以出现次数为4,5,6次,
- 排序后,第3、4个数肯定是多数元素
- 所以排序后,中位数肯定是多数元素,即
nums[n / 2]
1.2map/unordered_map
- 用unordered_map统计每个元素出现的次数,
- 最后输出出现最多的元素即可。
1.3遍历统计更新
- 根据多数元素出现的次数大于n/2且超过其它元素出现次数之和这一特点,进行统计。
- 遇到与当前元素res相同的,个数加一,
- 否则个数减一,
- 当个数为0,当前元素res更新为下一个元素。
2.力扣C++源码
1.1排序
class Solution {
public:
int majorityElement(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(), nums.end());
return nums[n / 2];
}
};
1.2map/unordered_map
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int, int> myMap;
int cnt = 0, res = 0;
for (auto num : nums) {
if (myMap.find(num) == myMap.end()) {
myMap[num] = 1;
}
else {
++myMap[num];
}
if (myMap[num] > cnt) {
cnt = myMap[num];
res = num;
}
}
return res;
}
};
1.3遍历统计更新
class Solution {
public:
int majorityElement(vector<int>& nums) {
int cnt = 0, res = 0;
for (auto num : nums) {
if (cnt == 0) {
res = num;
cnt = 1;
}
else {
if (num == res) {
++cnt;
}
else {
--cnt;
}
}
}
return res;
}
};
3.VS可运行源程序
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<limits>
#include<algorithm>
#include<math.h>
#include<map>
#include<unordered_map>
#pragma warning(disable:4996)
using namespace std;
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int, int> myMap;
int cnt = 0, res = 0;
for (auto num : nums) {
if (myMap.find(num) == myMap.end()) {
myMap[num] = 1;
}
else {
++myMap[num];
}
if (myMap[num] > cnt) {
cnt = myMap[num];
res = num;
}
}
return res;
}
};
int main()
{
printf("输入数组元素个数:");
int n;
scanf("%d", &n);
printf("输入数组元素:");
int num;
vector<int> nums;
for (int i = 0; i < n; i++) {
scanf("%d", &num);
nums.push_back(num);
}
Solution test;
int ans = test.majorityElement(nums);
printf("多数元素为:%d", ans);
printf("\n");
system("pause");
return 0;
}