/*
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
*/
class Solution {
public:
bool CheckMoreThanHalf(int a[], int length, int number) {
int nCnt = 0 ;
for(int i = 0; i < length; ++i) {
if(a[i] == number)
++nCnt ;
}
if(2 * nCnt > length) return true ;
return false ;
}
int MoreThanHalfNum_Solution(vector<int> numbers) {
if(numbers.size() == 0) return 0 ;
int nResult = numbers[0] ;
int nTimes = 1 ;
for(int i = 1; i < numbers.size(); ++i) {
if(nTimes == 0) {
nResult = numbers[i] ;
nTimes = 1 ;
}
if(numbers[i] == nResult) ++nTimes ;
else --nTimes ;
}
return CheckMoreThanHalf(&numbers[0], numbers.size(), nResult)? nResult : 0 ;
}
int MoreThanHalfNum_Solution1(vector<int> numbers) {
if(numbers.size() == 0) return 0 ;
int nMid = numbers.size() >> 1 ;
int nStart = 0 ;
int nEnd = numbers.size() - 1 ;
int nIndex = Partition(&numbers[0], numbers.size(), nStart, nEnd) ;
while(nIndex != nMid) {
if(nIndex > nMid) {
nEnd = nIndex - 1 ;
nIndex = Partition(&numbers[0], numbers.size(), nStart, nEnd) ;
}else {
nStart = nStart + 1 ;
nIndex = Partition(&numbers[0], numbers.size(), nStart, nEnd) ;
}
}
int nRet = numbers[nMid] ;
return CheckMoreThanHalf(&numbers[0], numbers.size(), nRet)? nRet : 0 ;
}
void Swap(int* a, int* b) {
int nTemp = *a ;
*a = *b ;
*b = nTemp ;
}
int Partition(int a[], int length, int start, int end) {
if(a == NULL || length <= 0 || start < 0 || end >= length || end < start) return -1 ;
if(end == start) return start ;
int nRand = start + rand() % (end - start + 1) ;
Swap(&a[nRand], &a[end]) ;
int small = start - 1 ;
for(int i = start; i < end; ++i) {
if(a[i] < a[end]) {
++small ;
if(small != i) {
Swap(&a[i], &a[small]) ;
}
}
}
++small ;
Swap(&a[small], &a[end]) ;
return small ;
}
};
数组中出现次数超过一半的数字
最新推荐文章于 2022-03-07 15:19:56 发布