169. Majority Element

Description

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.

Solution

Sort, time O(nlogn), space O(1)

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

HashMap

简直懒得写

Majority Voting Algorithm, time O(n), space O(1)

Majority Vote Alogrithm
A Linear Time Majority Vote Algorithm
算法的具体思路是:假设在给定长度为 n 的数组中,Majority Element 出现的次数是 k 次,那么非 Majority Element 的出现次数就为 n-k。如果我们能去掉这 n-k 个元素那么剩下的就全部是 Majority Element 了。

我们可以遍历数组,当碰到两个不一样的数字时,我们将这两个数字同时丢弃这两个数字中可能有一个为 Majority Element,也可能两个都不为Majority Element.因为k 大于 n/2,所以在最差情况下(每次移除不同数字时都包含一个Majority Element),我们仍然能够保证最后得到的数字是Majority Element.

在网上看到的很多资料中,对这一步的解释都是略微有些问题的。很多人简单的将这一步解释为:找到一个Majority Element,随后找到一个 非Majority Element,并将他们一并移除,这其实是错误的。我们在循环的时候,并没有办法判定当前的数字是否为 Majority Element,所以在移除的时候,我们可能是移除了一个 Majority Element 和一个 非Majority Element,也有可能移除的是两个非Majority Element。所以最后 count 的值是不确定的,但是它能够保证在最差情况下,剩余的仍然是 Majority Element。例如,[1,2,3,3,3] 和 [1,3,2,3,3] 这两个数组最后得到的 count 分别为 3 和 1,但是这并不影响答案的正确性。

这也是前面提到的Majority Element的数量必须大于n/2的原因.

很容易算出最后剩余的Majority Element个数最少为: n - ((n - k) + (n - k)) = 2k - n。

class Solution {
    public int majorityElement(int[] nums) {
        int major = 0;
        int count = 0;
        
        for (int i = 0; i < nums.length; ++i) {
            if (count == 0) {
                major = nums[i];
                ++count;
            } else if (major == nums[i]) {
                ++count;
            } else {
                --count;
            }
        }
        
        return major;
    }
}

你可能感兴趣的:(169. Majority Element)