以下内容均为本人学习笔记,若有错误,欢迎指出
链接:题目链接
来源:牛客网
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 |
分析
如果这个数字出现此处超过数组长度一半,那么若数组有序,这个数字一定是中位数,所以我们可以采用找数组中的中位数,还记得快速排序算法中的partion吗?这是一个O(N)查找数组中第size/2 大的数字。若找到第size/2 大的数字,且下标为size/2,则找到了。 |
class Solution {
public:
bool IStrue(vector<int> numbers,int length,int value)
{
int i = 0;
int count = 0;
for(i = 0;i < length;++i)
{
if(value == numbers[i])
{
count++;
}
}
if(count > length/2)
return true;
return false;
}
int partion(vector<int> numbers,int left,int right)
{
if(right - left <=1)
{
return left;
}
int tmp = numbers[right -1];
int start = left;
int end = right-1;
while(start < end )
{
while(start < end && numbers[start]<= tmp)
{
start++;
}
while(start < end && numbers[end]>= tmp)
{
end--;
}
if(start < end)
{
int cur = numbers[start];
numbers[start] = numbers[end];
numbers[end] = cur;
}
}
int cur = numbers[start];
numbers[start] = numbers[right - 1];
numbers[right - 1] = cur;
//swap(numbers[start], numbers[rigth -1]);
return left;
}
int MoreThanHalfNum_Solution(vector<int> numbers)
{
int length = numbers.size();
if(length == 0)
{
return 0;
}
int left = 0;
int right = length;
int index = 0;
int ret = 0;
while(left < right)
{
index= partion(numbers,left,right);
if(index == length/2)
{
ret = numbers[index];
break;
}
if(index < length/2)
{
left = index + 1;
}
else
{
right = index -1;
}
}
if(!IStrue(numbers,length,numbers[index]))
{
ret = 0;
}
return ret;
}
};