• 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;
        }
    }
    
  • 相关阅读:
    20160130.CCPP体系详解(0009天)
    20160129.CCPP体系详解(0008天)
    20160128.CCPP体系详解(0007天)
    20160127.CCPP体系详解(0006天)
    20160126.CCPP体系详解(0005天)
    程序员_你的“强迫症”有哪些?
    天天写业务代码_如何成为技术大牛?
    阿里云全球首批MVP李文毅专访-一个“改邪归正”的90后
    【毕业季】穿越回毕业前一年_这次你会怎么选
    恢复Hyper-V虚拟机丢失的数据文件过程
  • 原文地址:https://www.cnblogs.com/yjxyy/p/10772848.html
Copyright © 2020-2023  润新知