剑指Offer39.数组中出现次数超过一半的数字

题目:

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。 

示例 1:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

限制:

1 <= 数组长度 <= 50000

解题思路1:

由于要寻找的是出现次数超过数组长度一半的数字,首先想到的数组进行排序,其次就发现所要寻找的数字就是数组最中间的数字。

代码1:

public static int majorityElement(int[] nums) {
    Arrays.sort(nums);
    return nums[(nums.length)/2];
}

解题思路2:

摩尔算法:

每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。

这里利用count模拟摩尔投票。

代码2:

public static int majorityElement(int[] nums) {
        int number = 0;//记录取出的数据
        int count = 0;//记录取出数据去掉每次比较后不同的数字的个数
        for (int i = 0; i < nums.length; i++) {
            if (count == 0) {//count为0时才放入数据,否则一直在抵消不相同的数据
                number = nums[i];
            }

            if (nums[i] != number) {
                count--;
            }else {
                count++;
            }
        }
        return number;
    }

  

原文地址:https://www.cnblogs.com/ghlz/p/13329071.html