多数元素

  • 3 min read
  • Tags: 
  • leetcode

一 问题描述

统计数组中出现次数大于「n/2」的元素,其中n为数组长度,你可以假设该类元素必存在。

[ 169. 多数元素 ]

注意:「n/2」代表对算式 n/2 的结果向下取整,下同。

二 解决方法

1哈希表法

分析

题目要求统计出现次数大于「n/2」的元素,显而易见的方法是:统计所有元素出现的次数,找到其中大于「n/2」的元素。为了方便查找,使用以元素值为键、元素出现次数为值的哈希表作为数据结构。只要构建好哈希表后,目标元素就容易找出来了。

代码

  • 初始化以元素为键,以出现次数为值的哈希表

  • 遍历数组,将元素存放在哈希表中

  • 在遍历过程中,检查是否存在值大于「n/2」的元素,存在则返回该元素。

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        unordered_map<int, int> table;
        size_t len = nums.size();
        size_t num = len / 2, ret = 0;
        for (int i = 0; i < len; ++i) {
            if (++table[nums[i]] > num) {
                ret = nums[i];
                break;
            }
        } 
        return ret;
    }
};
  • 或者也可以在构建完成哈希表之后,遍历找到值最大的键(次数大于「n/2」肯定是最值),即为所需结果。

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        unordered_map<int, int> table;
        size_t len = nums.size();
        size_t cnt = 0, ret = nums[0];
        for (int i = 0; i < len; ++i) {
            ++table[nums[i]];
        } 
        for (const auto& item : table) {
            if (item.second > cnt) {
                cnt = item.second;
                ret = item.first;
            }
        } 
        return ret;
    }
};

2 排序法

分析

将数组排序,因为结果元素值出现次数大于「n/2」,考虑最极端情况:结果值最大/最小(起始/终止)且结果值次数为「n/2」+1,其数组下标「n/2」的位置也为该结果值,不管数组大小是奇数还是偶数。

代码

  • 给数组排序

  • 访问下标「n/2」位置的元素值

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        return nums[nums.size() / 2];
    }
};

三 总结

找到数据的特性,解决问题的方法也许很简单。比如方法2中提到排序法,是利用众数的特性,从而让我们可以快速找到目标元素。