X

LEETCODE 169. Majority Element 解题思路分析

题目大意:

多数元素

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

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

示例 1:

输入: [3,2,3]
输出: 3

示例 2:

输入: [2,2,1,1,1,2,2]
输出: 2

如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=169

解题思路分析:

这道简单题有很多种解法,最容易想到的就是统计一下每种数字的个数,其中个数最多的即是答案。另外一种解法可以将数组进行排序,由于肯定存在一个数字的个数大于总数的一半,因此,该数组排序后中间位置的数字一定是个数最多的那个。

上面简单的方法这里就不给出代码了。这道题其实是摩尔投票算法的经典实用场景,这里介绍一下该算法。

首先考虑最基本的摩尔投票问题,找出一组数字序列中出现次数大于总数一半的数字(并且假设这个数字一定存在)。显然这个数字只可能有一个。摩尔投票算法是基于这个事实:每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个

实现代码:

public int majorityElement(int[] nums) {
    int res=0; // 返回结果
    int count=0; // 未被抵消的数量
    for(int n : nums){ // 循环每个数字
        // 如果count为0,说明之前的数字都被抵消了
        if(count==0){
            res=n; // 将当前数字设为返回结果
            count=1; // 未被抵消的数量为1
        }else{ // count不为0
            // 当前数字与返回结果相同,count加一
            if(n==res) count++;
            // 反之count减一(count不会小于0,当等于0时会进入上面的if文)
            else count--;
        }
    }
    return res; // 剩下的元素即是返回结果。
}

本题解法执行时间为1ms。

Runtime: 1 ms, faster than 99.81% of Java online submissions for Majority Element.

Memory Usage: 42.6 MB, less than 58.82% of Java online submissions for Majority Element.

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-169-majority-element-解题思路分析/
Categories: leetcode
kwantong:

View Comments (0)