找出数组中出现一半以上次数的数字

网上有很多关于这题的解析,目前我看到最有的解法就是计数删除法,但代码很抽象,比较难理解,下面我谈谈自己理解,主要是为了加深印象。

 public int MoreThanHalfNum_Solution(int [] array) {
        //先检验输入是否合法,此处默认输入不合法时也输出为0
        if(array.length==0||array==null)
            return 0;
        int count = 1;
        int res = array[0];
        for(int i=1;i<array.length;i++){
            if(count==0){
                res = array[i];
                count++;
            }else{
                if(array[i]==res){
                    count++;
                }else{
                    count--;
                }
            }
        }
        if(isMoreThanHalf(array,res))
            return res;
        return 0;
        //检测总次数是否超过数组长度的一半
   
    }
    private boolean isMoreThanHalf(int[] arr,int res){
        int count = 0;
        for(int i=0;i<arr.length;i++){
            if(arr[i]==res)
                count++;
        }
        if(count*2>arr.length)
            return true;
        return false;
        
    }



       计数删除法的核心是每次删除数组中不同的两个数,则数组剩下的元素中原先占据一半以上的元素不会改变,当最后只剩下一个元素的时候,就是我们想要的结果。

      我们用数组{1,2,1,3,1,4,1,5,1}举例说明。首先我们定义 count = 1, res = array[0] = 1, 可以认为它表示当前待删除元素是 res= 1, 且数量是1; 接着继续遍历数组,此时count = 1, 我们需要比较下一个元素array[1] 和res 是否相等,相等的情况下,count ++,count = 2, 意味着待删除元素res存在两个,继续遍历下一个元素; 不相等的话,意味着我们找到了要删除的另外一个元素,此时 count--,  显然,属于第二种情况,我们删除了两个元素,此时 count = 0; 

     数组遍历到第三个元素,此时count ==0 ,表示待删除元素个数为 0 ,所以无论如何,都要把当前元素标记为待删除元素 res= arr[2] , count  = 1;以此类推直至遍历结束,res 就是我们想要的结果。

    过程中最重要的是对 count 的理解,它表示的是当前待删元素的个数,  count==0时意味着待删除元素个数为0,所以下一个元素一定要标记为待删除元素,且令 count = 1;     count!=0 时,我们需要判断下一个元素是否与待删除元素相同,相同的话,count++; 不同时表示我们找到了另外一个单删除的元素,此时可以进行删除, count--; 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值