《剑指offer》刷题——【时间效率】面试题39:数组中出现次数超过一半的数字(java实现)
一、题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组
{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不
存在则输出0。
二、题目分析
方法一:O(nlogn)
方法二:基于Partition函数的时间复杂度为O(n)–会修改数组
- 把数组排序,排序后位于数组中间的数字一定是那个出现次数超过一半的数字,即将问题转化为数组中第n/2大的数字
- 受快排的启发,O(n)得到数组中第k大的数字
- 先在数组中随机选择一个数字,然后调整数字的顺序,使得比选中的数字小的数字都排在它的左边,比选中的数字大的数字都排在它的右边
- 如果选中的数字的下标刚好是 n/2,那么这个数字就是数组的中位数
- 如果选中的数字的下标大于 n/2,那么中位数应该位于它的左边,接着在它的左边部分的数组中查找
- 如果选中的数字的下标小于n/2,那么中位数应该位于它的右边,接着在它的右边部分的数组中查找
public class Solution {
boolean inputInvalid = false;
public int MoreThanHalfNum_Solution(int [] array) {
if(CheckInvalidArray(array)){
return 0;
}
int mid = array.length >> 1;
int start = 0;
int end = array.length-1;
int index = Partition(array, start, end);
while(index != mid){
if(index > mid){
end = index-1;
index = Partition(array, start,end);
}
else{
start = index +1