28.数组中出现次数超过一半的数字

题目描述:

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

思路分析:

  第一种思路;给数组进行排序,然后由于次数超过一半的数肯定是中位数,那么直接取出中位数,然后遍历数组,看该数是不是超过一半。这种思路的时间复杂度为O(nlgn);

  第二种思路:遍历数组,利用HashMap保存值和它出现的次数,然后判断有没有次数超过一半的数字出现。这种思路的时间复杂度为O(n),空间复杂度也为O(n)。

  第三种思路:遍历数组,设置flag值为数组的第一个元素,并且给它设置一个count值,初始值为1,然后遍历后面的数,如果遇到相同的数count加一,如果遇到不同的数count减一。然后判断count值是否为0,如果为0,那么更新flag为当前遍历到的元素的下一个元素,然后和前面的步骤一样进行遍历,更新flag。当遍历结束后flag值可能就是满足要求的值,然后我们判断它是否出现超过一半,如果是就返回结果,不是就返回零。这种思路的时间复杂度为O(n)。

代码:

public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        if(array==null||array.length==0)
            return 0;
        int flag=array[0];
        int count=1;
        int i=1;
        while(i<array.length){
            if(array[i]!=flag){
                count--;
                if(count==0){
                    if(i+1<array.length){
                    flag=array[i+1];
                    count=1;
                    i=i+2;
                    }
                }else{
                    i++;
                }
            }else if(array[i]==flag){
                count++;
                i++;
            }
        }
        int times=0;
        for(int j=0;j<array.length;j++){
            if(array[j]==flag){
                times++;
            }
        }
        if(times>(array.length/2))
            return flag;
        return 0;
    }
}
原文地址:https://www.cnblogs.com/yjxyy/p/10772848.html