LeetCode-剑指39-数组中出现次数超过一半的数字

在这里插入图片描述
具体思路同LeetCode-169,此处我们仅讨论时间复杂度为 O ( n ) O(n) O(n)的方法。

1、哈希算法

我们利用哈希表记录每个数字出现的次数,最终遍历哈希表找到出现次数最多的数字即可。时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)

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 u m s [ 0 ] nums[0] nums[0]是数组中的多数元素,我们记录当前多数元素出现的次数 c o u n t = 0 count=0 count=0。每当我们读入一个新数字时,若他与我们假定的多数元素相同则 c o u n t + 1 count+1 count+1,否则 c o u n t − 1 count-1 count1。当此时 c o u n t < 0 count<0 count<0时,我们将读入的新元素作为新的多数元素并重复执行上述操作。这样当我们遍历完数组时, c o u n t count count一定大于0,此时的多数元素即为最终的多数元素。该方法的时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)

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;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值