169. 多数元素


169. 多数元素

难度简单
给定一个大小为 n *的数组,找到其中的多数元素。多数元素是指在数组中出现次数 *大于** ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例  1:
输入:[3,2,3]
输出:3
示例  2:
输入:[2,2,1,1,1,2,2]
输出:2

进阶:

  • 尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

常规法

private Map<Integer, Integer> countNums(int[] nums) &#123;
        Map<Integer, Integer> counts = new HashMap<Integer, Integer>();
        for (int num : nums) &#123;
            if (!counts.containsKey(num)) &#123;
                counts.put(num, 1);
            &#125; else &#123;
                counts.put(num, counts.get(num) + 1);
            &#125;
        &#125;
        return counts;
    &#125;

    public int majorityElement(int[] nums) &#123;
        Map<Integer, Integer> counts = countNums(nums);

        Map.Entry<Integer, Integer> majorityEntry = null;
        for (Map.Entry<Integer, Integer> entry : counts.entrySet()) &#123;
            if (majorityEntry == null || entry.getValue() > majorityEntry.getValue()) &#123;
                majorityEntry = entry;
            &#125;
        &#125;

        return majorityEntry.getKey();
    &#125;

排序

    public int majorityElement(int[] nums) &#123;
        Arrays.sort(nums);
        return nums[nums.length / 2];
    &#125;

投票算法

    public int majorityElement(int[] nums) &#123;
        int count = 0;
        Integer candidate = null;

        for (int num : nums) &#123;
            if (count == 0) &#123;
                candidate = num;
            &#125;
            count += (num == candidate) ? 1 : -1;
        &#125;

        return candidate;
    &#125;

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/

Boyer-Moore 投票算法
思路
如果我们把众数记为 +1,把其他数记为 −1,将它们全部加起来,显然和大于 0,从结果本身我们可以看出众数比其他数多。
算法
Boyer-Moore 算法的本质和方法四中的分治十分类似。
我们首先给出 Boyer-Moore 算法的详细步骤
我们维护一个候选众数 candidate 和它出现的次数 count。初始时 candidate 可以为任意值,count 为 0;
我们遍历数组 nums 中的所有元素,对于每个元素 x,在判断 x 之前,如果 count 的值为 0,我们先将 x 的值赋予 candidate,随后我们判断 x:
如果 x 与 candidate 相等,那么计数器 count 的值增加 1;
如果 x 与 candidate 不等,那么计数器 count 的值减少 1。
在遍历完成后,candidate 即为整个数组的众数。
复杂度分析
时间复杂度:O(n)。Boyer-Moore 算法只对数组进行了一次遍历。
空间复杂度:O(1)。Boyer-Moore 算法只需要常数级别的额外空间。


文章作者:   future
版权声明:   本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 future !
 上一篇
448. 找到所有数组中消失的数字 448. 找到所有数组中消失的数字
448. 找到所有数组中消失的数字难度简单给定一个范围在   1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不
下一篇 
674. 最长连续递增序列 674. 最长连续递增序列
674. 最长连续递增序列难度简单 172给定一个未经排序的整数数组,找到最长且**  连续递增的子序列,并返回该序列的长度。**连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i <
  目录