题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
第一种,暴力解法,直接将数组进行排序,要不返回在中间的那个数,要不就返回0
因为用到了快排,所以时间复杂度为O(nlogn)
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
sort(numbers.begin(),numbers.end());
int count = 0;
int temp = numbers[numbers.size()/2];
for(int i = 0; i < numbers.size(); ++i)
{
if(temp == numbers[i])
count++;
}
if(count > numbers.size()/2)
return temp;
return 0;
}
};
第二种思路,遍历整个数组,用两个变量,一个保存次数,一个保存数字,那么从前向后遍历,碰到相同的数字,次数++,不同的数字,次数--
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int count = 0;
int temp = numbers[0];
for(int i = 0;i < numbers.size(); ++i)
{
if(temp == numbers[i])
{
count++;
}else{
count--;
if(count < 0)
{
temp = numbers[i];
count = 0;
}
}
}
if(count > 0)
return temp;
return 0;
}
};