LeetCode 面试题 17.10. 主要元素

该博客介绍了如何利用Boyer-Moore投票算法在O(N)时间和O(1)空间复杂度内找到数组中的主要元素。主要元素是指在数组中出现次数超过数组长度一半的元素。解决方案包括初始化candidate和count变量,遍历数组更新candidate和count,最后再遍历一次计算candidate的出现次数来确认主要元素。如果主要元素存在则返回,否则返回-1。
摘要由CSDN通过智能技术生成

难度:简单。
标签:数组,计数。

要求设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。
题解,采用Boyer-Moore 投票算法。
维护一个candidate和count,开始count为0.
遍历数组,若count = 0,则将当前值x赋给candidate,若当前值x=candidate,则count+1,不等于count-1.
遍历完数组,若有主要元素,即为candidate,若没有,candidate值不确定。
因此最后在遍历一次数组,计算candidate出现的次数。

正确解法:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int n = nums.size();
        int candidate = 0, count = 0;
        for(int i = 0; i < n; ++i){
            if(count == 0)candidate = nums[i];
            if(candidate == nums[i])count++;
            else count--;
        }
        int m = 0;
        for(int i = 0; i < n; ++i){
            if(nums[i] == candidate)m++;
        }
        if(n / 2 + 1 > m)return -1;
        return candidate;
    }
};

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值