zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

算法数组 数字 出现 次数 超过 一半
2023-09-11 14:16:50 时间

题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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;
    }
}