美文网首页剑指offer
剑指offer-面试题39:数组中出现次数超过一半的数字

剑指offer-面试题39:数组中出现次数超过一半的数字

作者: 依然慢节奏 | 来源:发表于2020-05-14 18:10 被阅读0次

    题目描述

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

    思路分析

    可以分析得到,有一个数字出现次数超过数组长度的一半,也就是说它出现的次数比其它所有数字出现次数的和还要多,如果数组长度为n,那么出现次数k肯定满足k > n/2。首先我们需要找出这个数字然后再判断出现的次数是否满足次数条件,我们考虑用两个值来找出这个数字。temp维持数组中的数字值,tim计算该数字出现的次数,如果下一个数字相同则次数加一,如果不相同则次数减一。如果次数为0进行重置操作,将temp的值设置为当前值,次数设置为一。由于我们要找的数字出现的次数比其它所有数字出现的次数之和还要多,那么要找的数字肯定是最后一次把次数设置为一的数字。例如:{1,2,3,2,2,2,5,4,2}结果是2

    代码实现

     public class Solution {
        public int MoreThanHalfNum_Solution(int [] numbers) {
            if (numbers.length == 0) {
                return 0;
            }
            int temp = numbers[0];
            int time = 1;
            //[1,2,3,2,4,2,5,2,3]
            //{1,2,3,2,2,2,5,4,2}
            for (int i = 1; i < numbers.length; ++i) {
                if (time == 0) {
                    temp = numbers[i];
                    time = 1;
                } else if (temp == numbers[i]) {
                    ++time;
                } else {
                    --time;
                }
            }
            // 判断 temp 是否符合要求
            int count = 0;
            for (int number : numbers) {
                if (temp == number) {
                    ++count;
                }
            }
            if (count > numbers.length / 2) {
                return temp;
            } else {
                return 0;
            }
        }
    }
    

    欢迎关注南阁公众号

    南阁子也

    相关文章

      网友评论

        本文标题:剑指offer-面试题39:数组中出现次数超过一半的数字

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