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


    题目描述

    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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;
        }
    }
  • 相关阅读:
    C++逐行读取文本文件的正确做法
    <Android Framework 之路>Android5.1 Camera Framework(一)
    zeromq-4.1.2在windows下的编译
    Duilib应用修改程序图标方法
    gdal集成kml库的做法
    使用DWR实现JS调用服务端Java代码
    DirectUI界面编程(六)实现右键弹出菜单
    如何设计系统的错误码及错误信息
    TCP协议格式
    UDP协议
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/10305494.html
Copyright © 2020-2023  润新知