[算法]数组中出现次数超过一半的数字

Posted darrenchan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[算法]数组中出现次数超过一半的数字相关的知识,希望对你有一定的参考价值。

题目描述

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

思路

这道题最简单的思路就是排序,然后统计每个数字出现的次数,这样时间复杂度是O(nlogn)。

也可以用哈希表进行次数的统计,但是这样最大的空间复杂度是O(n)。

这里提供一种时间复杂度是O(n),空间复杂度是O(1)的解法。

数组中有一个数字出现的数字超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数还要多。在遍历数组的时候,保存三个变量,一个是当前元素出现的次数,一个是当前元素,一个是数组中出现次数最多的元素值。当我们遍历到下一个数字的时候,如果下一个数字和当前元素值相等,则次数加1,如果不相等,则次数减1。如果次数为0,则当前元素等于下一个数字,并把次数设为1,最后剩下的那个肯定是出现次数最多的元素,记录出现次数最多的元素值,最后验证是否超过数组一半的数字。

代码

public class Solution {
   public int MoreThanHalfNum_Solution(int[] array) {
        int count = 1;//当前元素出现的次数
        int number = array[0];//当前的元素
        int maxnum = array[0];//数组中出现次数最多的元素值

        for (int i = 1; i < array.length; i++) {
            if(array[i] != number){
                count--;
                if(count == 0){
                    number = array[i];
                    maxnum = array[i];
                    count = 1;
                }
            }else{
                count++;
            }
        }

        //验证
        int sum = 0;
        for (int i = 0; i < array.length; i++) {
            if(array[i] == maxnum){
                sum++;
            }
        }

        return sum * 2 > array.length ? maxnum : 0;
    }
}

 

以上是关于[算法]数组中出现次数超过一半的数字的主要内容,如果未能解决你的问题,请参考以下文章

算法剑指 Offer 39. 数组中出现次数超过一半的数字 重刷

出现次数超过一半的数字

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

数组中出现次数超过一半的数字(C语言+Java)

剑指Offer面试题29(java版):数组中出现次数超过一半的数字

剑指Offer:数组中出现次数超过一半的数字39