数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
题目是这样子的,= =,当然,能够想到的办法可以用hash表来统计下每个元素出现的个数,然后判断是不是有超过了总数一半的数字就可以得出答案了。
然而。。。
作为一个比较折腾的博主,非要用找中位数的方法来求得答案。
思路是按照快速排序的函数,找到”中位数“,然后遍历数组,判断这个数的出现次数是不是超过了一半,是不是很作死啊 = =
code 如下:
class Solution {
public:
int Partion(vector<int >& vec , int begin , int end ){
if(vec.size() == 0 || begin < 0 || end < 0 ){
return -1;
}
int tmp = vec[ begin ];
while(begin < end && begin >=0){
while ( begin < end && vec[end ] >= tmp ){ //记得是大于等于符号哦
end--;
}
if(begin < end )
{
vec[begin ] = vec[end];
begin++;//要记得加上额
}
while(begin < end && vec[begin ] < tmp){
begin ++;
}
if(begin < end )
{
vec[end ] = vec[begin ];
end--;//要记得减去
}
}
vec[begin ] = tmp;
return begin ;
}
int MoreThanHalfNum_Solution(vector<int> numbers) {
if(numbers.size() == 0) return 0;
size_t mid = numbers.size()/2;
int begin = 0;
int end = numbers.size() - 1;
size_t index = Partion(numbers, begin , end );
while(index != mid){
if( index > mid ){
index = Partion( numbers , begin , index -1);
}
else {
index = Partion( numbers , index + 1 , end );
}
}
int mid_num = numbers[index];
size_t times = 0;
for(size_t index =0 ; index <numbers.size() ; index++ ){
if(numbers[index] == mid_num){
times++;
}
}
if(times*2 > numbers.size()) return mid_num;
else return 0;
}
};