剑指Offer——面试题39:数组中出现次数超过一半的数字

面试题39:数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

#include<iostream>
#include<algorithm>
using namespace std;
int RandomInRange(int min, int max){
    int random = rand() % (max - min + 1) + min;
    return random;
}
int Partition(int data[], int length, int start, int end){
    if(data == NULL || length <= 0 || start < 0 || end >= length)
        throw new std::exception();

    int index = RandomInRange(start, end);
    swap(data[index], data[end]);

    int small = start - 1;
    for(index = start; index < end; ++ index)
    {
        if(data[index] < data[end])
        {
            ++ small;
            if(small != index)
                swap(data[index], data[small]);
        }
    }

    ++ small;
    swap(data[small], data[end]);

    return small;
}
bool g_bInputInvalid=false;
bool CheckInvalidArray(int* numbers, int length){
	g_bInputInvalid=false;
	if(numbers==NULL || length<=0) g_bInputInvalid=true;
	return g_bInputInvalid;
}
bool CheckMoreThanHalf(int* numbers, int length, int number){
	int times=0;
	for(int i=0;i<length;i++){
		if(numbers[i]==number) times++;
	}
	bool isMoreThanHalf=true;
	if(times*2<=length){
		g_bInputInvalid=true;
		isMoreThanHalf=false;
	}
	return isMoreThanHalf;
}
// 解法一:基于 Partition 函数的时间复杂度为 O(n) 的算法 
int MoreThanHalfNum(int* numbers, int length){
	if(CheckInvalidArray(numbers, length)) return 0;
	int middle=length>>1;
	int start=0, end=length-1;
	int index=Partition(numbers, length, start, end);
	while(index!=middle){
		if(index>middle){
			end=index-1;
			index=Partition(numbers, length, start, end);
		}else{
			start=index+1;
			index=Partition(numbers, length, start, end);
		}
	}
	int result=numbers[middle];
	if(!CheckMoreThanHalf(numbers, length, result)) result=0;
	return result;
}
// 解法二:根据数组特点找出时间复杂度为O(n)的算法
int MoreThanHalfNum2(int* numbers, int length){
	if(CheckInvalidArray(numbers, length)) return 0;
	int result=numbers[0];
	int times=1;
	for(int i=1;i<length;i++){
		if(times==0){
			result=numbers[i];
			times=1;
		}else if(numbers[i]==result) times++;
		else times--;
	}
	if(!CheckMoreThanHalf(numbers, length, result)) result=0;
	return result;
}
int main() {
	int numbers[]={1,2,3,2,2,2,5,4,2};
	printf("%d",MoreThanHalfNum2(numbers, 9));
	return 0;
}
发布了42 篇原创文章 · 获赞 43 · 访问量 1054

猜你喜欢

转载自blog.csdn.net/qq_35340189/article/details/104434602
今日推荐