【28】数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
整体思路:首先先得到数组的大小信息,然后将数组进行排序,选择快速排序,复杂度为o(lgn)
然后依次半段是否大于数组长度的一半
原代码如下:
vector<int >::iterator Point(vector<int>::iterator beg, vector<int>::iterator end){
int tmp_value = *beg;
while(beg<end){
while(beg<end&&*end>=tmp_value)
end--;
int swap_tmp = *end;
*end = *beg;
*beg = swap_tmp;
while(beg<end&&*beg<=tmp_value)
beg++;
swap_tmp = *end;
*end = *beg;
*beg = swap_tmp;
}
return beg;
}
//快速排序
void Qsort(vector<int>::iterator array_beg, vector<int >::iterator array_end){
if(array_beg<array_end){
auto pritor = Point(array_beg, array_end);
Qsort(array_beg, pritor);
Qsort(pritor+1, array_end);
}
}
int MoreThanHalfNum_Solution(vector<int> numbers) {
Qsort(numbers.begin(), numbers.end()-1);
float flag = numbers.size()/2.0;
int tmp = *numbers.begin();
int counter = 0;
for(auto i= numbers.begin();i!=numbers.end();++i){
if(*i==tmp){
++counter;
}
else{
counter = 1;
tmp = *i;
}
if(counter>flag)
return tmp;
}
return 0;
}
高赞答案:
书中的保存一个数,保存一个次数的方法很有意思