码迷,mamicode.com
首页 > 编程语言 > 详细

数组中出现次数超过一半的数

时间:2018-08-16 15:44:27      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:col   一半   ash   等于   目的   lse   --   元素   nbsp   

思想:这种题目一般都会要求o(n)的时间复杂度和o(1)的空间,目的就是为了不让你使用HashMap来统计计算。这里我们可以采用两两消除的思想去实现,例如一个数组arr为:1 2 2 3 2 1 2,那么我们把第一个元素arr[0]当作开始的元素k,它的出现次数count赋值为1,然后从第二个元素arr[1]开始往后遍历数组,如果arr[1] == k ,那么我们就把count++,如果不等于,我们就count--,如果count减为0了,那么重新把当前的元素arr[i]赋值给k,count重新赋值为1,然后继续这样比较。拿这个数组来说,最后k肯定为2,因为2出现的次数超过一半了。

public static void search(int[] arr) {
        if(arr.length == 0) return;
        int count = 1; //保存出现的次数
        int k = arr[0];
        for(int i = 1; i < arr.length; i++) {
            if(k == arr[i]) count++;
            else {
                count--;
                if(count == 0) {
                    k = arr[i];
                    count = 1;
                }
            }
        }
        count = 0;
        //也有可能没有元素超过一半,所以需要再次判断一下
        for(int i = 0; i < arr.length; i++) {
            if(arr[i] == k) count++;
        }
        if(count > arr.length / 2) System.out.println(k);
        else System.out.println("未找到!");
        
    }

 

数组中出现次数超过一半的数

标签:col   一半   ash   等于   目的   lse   --   元素   nbsp   

原文地址:https://www.cnblogs.com/neuzk/p/9487463.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!