春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。
给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。
若没有金额超过总数的一半,返回0。
测试样例:
[1,2,3,2,2],5
返回:2
这和我在《剑指offer》上做过的一道题类似:数组中出现次数超过一半的数字,是快排和 STL::map 的应用
map 版:
class Gift {
public:
int getValue(vector<int> gifts, int n) {
// write code here
if ( gifts.size() != n ) return -1 ;
map<int, int> m ;
for ( int i = 0; i < gifts.size(); ++ i ) {
m[ gifts[i] ] ++ ;
}
for ( map<int, int>::iterator iter = m.begin(); iter != m.end(); ++ iter ) {
if ( iter->second > ( gifts.size() / 2 ) ) return iter->first ;
}
return 0 ;
}
};
快排版
class Gift {
public:
int getValue(vector<int> gifts, int n) {
// write code here
if ( gifts.size() != n ) return -1 ;
QuickSort( gifts, 0, gifts.size() - 1 ) ;
bool isHalf = CheckHalf( gifts ) ;
return isHalf == true ? gifts[gifts.size() / 2] : 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 ) ;
}
bool CheckHalf( vector<int>& vec ) {
int half = vec[ vec.size() / 2 ] ;
int count = 0 ;
for ( vector<int>::iterator iter = vec.begin(); iter != vec.end(); ++ iter ) {
if ( *iter == half ) ++ count ;
}
return count > ( vec.size() / 2 ) ? true : false ;
}
};
第二次做:
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 {
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 ;
}
};