春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。
给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。
若没有金额超过总数的一半,返回0。
测试样例:
[1,2,3,2,2],5
返回:2
有三种方法可以做出这道题
使用STL中的map
class Gift {
public:
int getValue(vector<int> vec, int n) {
// write code here
map<int, int> m ;
for ( int i = 0; i < vec.size(); ++ i ) {
m[ vec[i] ] ++ ;
}
for ( map<int, int>::iterator iter = m.begin(); iter != m.end(); ++ iter ) {
if ( iter->second > ( m.size() / 2) ) return iter->first ;
}
return 0 ;
}
};
快速排序
class Gift {
public:
int getValue(vector<int> vec, int n) {
// write code here
if ( vec.empty() == true ) return 0 ;
QuickSort( vec, 0, vec.size() - 1 ) ;
int middle = vec[ vec.size() / 2 ] ;
int tmp = 0 ;
for ( int i = 0; i < vec.size(); ++ i ) {
if ( vec[i] == middle ) ++ tmp ;
}
if ( tmp >= ( vec.size() / 2 ) ) return middle ;
else return 0 ;
}
private:
void QuickSort( vector<int>& vec, int left, int right ) {
int i = left ;
int j = right ;
int pivot = vec[( i + j ) / 2] ;
while ( i - j <= 0 ) {
if ( vec[i] < pivot ) ++ i ;
else if ( vec[j] > pivot ) -- j ;
else {
int tmp = vec[i] ;
vec[i] = vec[j] ;
vec[j] = tmp ;
++ i ;
-- j ;
}
}
if ( left < j ) QuickSort( vec, left, j ) ;
if ( i < right ) QuickSort( vec, i, right ) ;
}
};
删除不同数
class Gift {
int getValue(int[] gifts, int n) {
int gift=-1,times=0;
for(int i=0;i<n;i++){
if(times==0){
gift=gifts[i];
}
if(gift==gifts[i]){
times++;
}else{
times--;
}
}
//处理不存在出现次数超过一半的情况
int count=0;
for(int i=0;i<n;i++){
if(gift==gifts[i]){
count++;
}
}
return count>n/2?gift:0;
}
}