39、数组中出现次数超过一半的数字

1、题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

2、思路:这道题解法较多,

解法一:对数组进行排序,然后找中位数,因为一个数字出现次数超过数组长度的一半,那么中间一定是它,找到中位数后,在进行次数统计校验,若真的大于数组长度一半,就返回,否则返回0。找中位数的过程可以参照快速排序算法实现,先找个基准,然后将小于这个数的都放在左边,大于这个数的都放在右边,移动之后,若这个数的下标刚好是n/2,那么就是中位数了,若这个数的下表大于n/2那么中位数一定位于它左侧,那么在左侧查找这个中位数。是个递归的过程。

解法二:数组中有一个数字出现的次数超过数组长度的一半,我们就可以遍历一遍这个数组,遇到相同的数count+1,遇到不同的数就count-1,count=0了就重新赋值,最后count为正的这个数,就是该数字,然后在校验一下。

3、代码:时间复杂度O(n)

public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        int count=1;
        int num=array[0];
     //找出出现次数超过数组长度一半的数
for(int i=1;i<array.length;i++){ if(array[i]==num){ count++; }else{ count--; if(count==0){ num=array[i]; count=1; } } }
     //统计它出现了多少次
int times=0; for(int i=0;i<array.length;i++){ if(num==array[i]){ times++; } }
if(times*2>array.length){ return num; }else{ return 0; } } }

注意:实际面试时别忘了鲁棒性校验。

猜你喜欢

转载自www.cnblogs.com/guoyu1/p/12160460.html