Leetcode169.多数元素——摩尔投票

文章目录

  • 引入
  • 摩尔投票

引入

Leetcode上有如下的题:

169.多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 :
输入: [2,2,1,1,1,2,2]
输出: 2

乍一看的时候,直接想用HashMap来做,键是元素,值是元素的count。
这是第一种方法:其时间和空间复杂度都是是O(N)。

第二种方法是通过排序数组,然后取数组的中位数:因为多数元素是超过了半数的,所以中位数=众数,该方法需要排序,如果是使用原地排序,那么时间复杂度是O(NlogN),空间复杂度是O(1)。

第三种方法,就是使用摩尔投票。

摩尔投票

如果我们把众数记为 +1 ,把其他数记为 -1,将它们全部加起来,显然和大于 0 ,从结果本身我们可以看出众数比其他数多。

我们当然并不知道哪个数最开始是众数,所以我们把数组众第一个遇到的数作为众数候选(candidate)。
然后循环遍历,如果用计数器表示这个众数候选比其他数数目多多少。如果计数器变成了0,那么不认为它是众数。取它后一个数作为新的众数。

注意,我们这里所说的众数,其数目超过了一半,如果少于一半,显然不能用方法二和这里的方法三。

class Solution {
    public int majorityElement(int[] nums) {
        int count = 0;//计数器
        Integer candidate = null;

        for (int num : nums) {
            if (count == 0) {
                candidate = num;
            }
            count += (num == candidate) ? 1 : -1;
        }

        return candidate;
    }
}

你可能感兴趣的:(LeetCode)