169.majority-element

169. Majority Element

题目描述

找出n个数中出现n/2次的数

思路

用 map 记录每个数出现的次数,超过 n/2+n%2 次的就 return

官方解法
  1. 哈希表
    时间复杂度 O(n)
    空间复杂度 O(n)
    c++代码
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        unordered_map<int, int> counts;
        int majority = 0, cnt = 0;
        for (int num: nums) {
            ++counts[num];
            if (counts[num] > cnt) {
                majority = num;
                cnt = counts[num];
            }
        }
        return majority;
    }
};

2. 排序 先排序,排序后下标为 n/2 的元素就是众数 时间复杂度 O(nlogn) 空间复杂度 O(logn)
3. 随机化 随机挑选一个下标对应的元素并验证 期望的时间复杂度为 O(n) 空间复杂度O(1)
4. 分治 将数组分成左右两部分,分别求出左半部分的众数 a1 以及右半部分的众数 a2,随后在 a1 和 a2 中选出正确的众数。 时间复杂度 O(nlogn) 空间复杂度 O(logn)
5. Boyer-Moore 投票算法 如果我们把众数记为 +1,把其他数记为 −1,将它们全部加起来,显然和大于 0,从结果本身我们可以看出众数比其他数多。 出现一次别的数就抵消掉一个众数,这样最后还是会留下的是众数。 时间复杂度 O(n) 空间复杂复 O(1) c++代码
class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int candidate = -1;
        int count = 0;
        for (int num : nums) {
            if (num == candidate)
                ++count;
            else if (--count < 0) {
                candidate = num;
                count = 1;
            }
        }
        return candidate;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值