zoukankan      html  css  js  c++  java
  • 28.数组中出现次数超过一半的数字

    题目描述:

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

    思路分析:

      第一种思路;给数组进行排序,然后由于次数超过一半的数肯定是中位数,那么直接取出中位数,然后遍历数组,看该数是不是超过一半。这种思路的时间复杂度为O(nlgn);

      第二种思路:遍历数组,利用HashMap保存值和它出现的次数,然后判断有没有次数超过一半的数字出现。这种思路的时间复杂度为O(n),空间复杂度也为O(n)。

      第三种思路:遍历数组,设置flag值为数组的第一个元素,并且给它设置一个count值,初始值为1,然后遍历后面的数,如果遇到相同的数count加一,如果遇到不同的数count减一。然后判断count值是否为0,如果为0,那么更新flag为当前遍历到的元素的下一个元素,然后和前面的步骤一样进行遍历,更新flag。当遍历结束后flag值可能就是满足要求的值,然后我们判断它是否出现超过一半,如果是就返回结果,不是就返回零。这种思路的时间复杂度为O(n)。

    代码:

    public class Solution {
        public int MoreThanHalfNum_Solution(int [] array) {
            if(array==null||array.length==0)
                return 0;
            int flag=array[0];
            int count=1;
            int i=1;
            while(i<array.length){
                if(array[i]!=flag){
                    count--;
                    if(count==0){
                        if(i+1<array.length){
                        flag=array[i+1];
                        count=1;
                        i=i+2;
                        }
                    }else{
                        i++;
                    }
                }else if(array[i]==flag){
                    count++;
                    i++;
                }
            }
            int times=0;
            for(int j=0;j<array.length;j++){
                if(array[j]==flag){
                    times++;
                }
            }
            if(times>(array.length/2))
                return flag;
            return 0;
        }
    }
    
  • 相关阅读:
    vue 兼容IE报错解决方案
    JDK1.8 ArrayList 源码解析
    Mac nasm 汇编入门
    命令模式
    模板方法
    Mysql Limit 调优
    观察者模式
    外观模式
    Rest- Client
    MongoDB数据库 5分钟快速上手
  • 原文地址:https://www.cnblogs.com/yjxyy/p/10772848.html
Copyright © 2011-2022 走看看