题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
解题思路
解题思路分为两步;
1.令count = 0;对数组进行遍历,当count=0的时候,tmp等于当前遍历的值,count++,当当前遍历的值等于tmp的时候,count++,不等于tmp的时候count–,由此得到tmp,当如果真的存在超过一半的数字的时候,我们得到的tmp一定是该值。
2.检验tmp这个数字出现的次数是否超过一半,如果超过了则返回tmp,否则返回0。
具体代码如下:
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers)
{
if (numbers.size() == 0) return 0;
if (numbers.size() == 1) return numbers[0];
int count = 0;
int tmp;
for (auto x : numbers)
{
if (count == 0)
{
tmp = x;
count++;
}
else
{
if (x != tmp) count--;
if (x == tmp) count++;
}
}
if (count > 0 && checkMoreThanHalf(numbers, tmp))
return tmp;
return 0;
}
bool checkMoreThanHalf(vector<int> numbers, int number)
{
int time = 0;
for (int i = 0; i < numbers.size(); i++)
{
if (numbers[i] == number)
{
time++;
}
}
if (time*2 > numbers.size()) return true;
return false;
}
};