美文网首页程序员
剑指offer----数组中超过一半的数

剑指offer----数组中超过一半的数

作者: qming_c | 来源:发表于2018-02-06 20:59 被阅读0次

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

public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        if( array == null || array.length == 0){
            return 0;
        }
        int result = array[0];
        int time = 1;
        for(int i = 1; i < array.length; i++){
            if(time == 0){
                result = array[i];
                time = 1;
                continue;
            }
            if(result == array[i]){
                ++time;
            }else{
                --time;
            }
        }
        time = 0;
        for(int i = 0; i < array.length; i++){
            if(array[i] == result){
                time++;
            }
        }
        return time > (array.length/2) ? result : 0;
    }
}

**如果在一个数组中,某个数k的的个数大于数组的一半。那么每个k都与另外一个不相同的数抵消后,那么最后剩下的一个或者几个数一定是这个数k。
我们可以定义一个变量time,类似于线程调度中的信号量,先让result等于array[0],并将time置为1;
当下一个数与result一致时,time+1
不一致时,time-1
当time = 0时,说明前面两个不同的数都两两消除了,此时再重新更新time和reuslt;
如果该数组中有大于一半的数的时候,最后result一定是那个数。
因为在最差的情况下,就像前面**标注的所说,最后这个k一定会被剩下

12 12 12 2
12 12 1 1 2 

相关文章

网友评论

    本文标题:剑指offer----数组中超过一半的数

    本文链接:https://www.haomeiwen.com/subject/qcrnzxtx.html