题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路
- 对这个数组进行排序,然后中位数就是结果,时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)
- 定义一个res保存当前数组的元素,times保存数字出现的次数,当出现相同的数字,times++,否则times–。当times==0时,更新res,保存下一个数字,同时赋值res=1。这样遍历完数组后,res保存的就是数组中出现次数最多的元素,然后在判断其出现的次数是不是超过数组长度的一半即可,时间复杂度为 O ( n ) O(n) O(n).
AC代码
#include <iostream>
#include <vector>
using namespace std;
class Solution
{
public:
int MoreThanHalfNum_Solution(vector<int> numbers)
{
if (numbers.size() == 0)
return 0;
int res = numbers[0];
int times = 1;
for (int i = 1; i < numbers.size(); i++)
{
if (numbers[i] == res)
times++;
else
times--;
if (times == 0)
{
times = 1;
res = numbers[i];
}
}
//判断是否符合出现次数大于数组长度的一半
times = 0;
for (int i = 0; i < numbers.size(); i++)
{
if (res == numbers[i])
times++;
}
if (times * 2 > numbers.size())
return res;
else
return 0;
}
};
int main()
{
vector<int> num = {1, 2, 3, 2, 4, 2, 5, 2, 3};
Solution so;
cout << so.MoreThanHalfNum_Solution(num) << endl;
return 0;
}