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

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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 
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,844评论 6 13
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,446评论 0 4
  • 数组 记录《剑指offer》中所有关于数组的题目,以及LeetCode中的相似题目 相关题目列表 说明 由于简书...
    wenmingxing阅读 5,370评论 1 12
  • 过度的自信,麻木、无知、对金钱的崇拜,真是令人咋舌,同时也刷新我的认知。但我们无权干涉别人的思想,不想再说些什么。...
    Mr_GoDam阅读 1,124评论 0 0
  • 尽管世间事多磨,我还是愿意相信人间有美好的爱情,那种童话般的爱情,一生只爱一个人,一生一世一双人。
    原来是哈哈呀阅读 1,014评论 0 0