题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
1、先排序再找到数组中出现次数超过一半的数字 时间复杂度O(nlogn)
class Solution {
public:
bool CheckMoreThanHalf(vector<int> numbers,int number)
{
int len=numbers.size();
int times=0;
for(int i=0;i<len;i++)
{
if(numbers[i]==number)
times++;
}
if(times*2<=len) return false;
else return true;
}
int MoreThanHalfNum_Solution(vector<int> numbers) {
int len=numbers.size();
if(len<=0) return 0;
sort(numbers.begin(),numbers.end());
//出现次数超过一半的数字位于第len/2大的数
int result=*(numbers.begin()+len/2);
//判断result个数是否大于一半
if(!CheckMoreThanHalf(numbers,result))
return 0;
return result;
}
};
2、根据数组特点设计 时间复杂度O(n)
class Solution {
public:
bool CheckMoreThanHalf(vector<int> numbers,int number)
{
int len=numbers.size();
int times=0;
for(int i=0;i<len;i++)
{
if(numbers[i]==number)
times++;
}
if(times*2<=len) return false;
else return true;
}
int MoreThanHalfNum_Solution(vector<int> numbers) {
int len=numbers.size();
if(len<=0) return 0;
//找到最后一个把次数设为1的数result
int result=numbers[0];
int times=1;
for(int i=1;i<len;i++)
{
if(numbers[i]==result)
times++;
else if(numbers[i]!=result&×>0)
times--;
else
{
result=numbers[i];
times=1;
}
}
//判断result个数是否大于一半
if(!CheckMoreThanHalf(numbers,result))
return 0;
return result;
}
};
3、基于Partition函数 时间复杂度O(n)
class Solution {
public:
//判断number是否超过数组个数的一半
bool CheckMoreThanHalf(vector<int> numbers,int number)
{
int len=numbers.size();
int times=0;
for(int i=0;i<len;i++)
{
if(numbers[i]==number)
times++;
}
if(times*2<=len) return false;
else return true;
}
int Partition(vector<int>& input, int begin, int end)
{
int low=begin;
int high=end;
int pivot=input[low];
while(low<high)
{
while(low<high&&pivot<=input[high])
high--;
input[low]=input[high];
while(low<high&&pivot>=input[low])
low++;
input[high]=input[low];
}
input[low]=pivot;
return low;
}
int MoreThanHalfNum_Solution(vector<int> numbers) {
int len=numbers.size();
if(len<=0) return 0;
//找到位于中间位置的数
int mid=len>>1;
int start=0;
int end=len-1;
int index=Partition(numbers,start,end);
while(index!=mid)
{
if(index>mid)
{
end=mid-1;
index=Partition(numbers,start,end);
}
else
{
start=mid+1;
index=Partition(numbers,start,end);
}
}
int result=numbers[mid];
//判断result个数是否大于一半
if(!CheckMoreThanHalf(numbers,result))
return 0;
return result;
}
};