LeetCode 229. Majority Element II

题目

在这里插入图片描述

分析

这道题是之前写过的Leetcode169. Majority Element的一个延伸,就是做了一点点小小的变化。关键点还是169里提到的摩尔投票法,在那篇写的很清楚了。

现在的问题是要找出所有出现不少于n/3次的元素,首先可以确定的是满足这样的元素最多只有俩。因为假设有3个,那这三个的数量加起来就>n,显然是错误的,知道了这一点接下来我们就可以直接来找出出现最多的两个众数。

需要注意的是这两个筛选出来的众数不一定是都满足的,举个例子1,1,1,2,3,5,肯定会筛出来1,另一个无论说2、3、5里的哪一个都是不对的。所以需要再遍历一次数组,检查这两个众数出现的次数是否真的大于n/3。

代码

class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        int l, r, cnt1 = 0, cnt2 = 0;
        for (auto a : nums) {
        	//这里需要写成if elseif 避免l和r重复
            if (a == l) cnt1++;
            else if (a == r) cnt2++;
			// 这里有一个巧妙的处理,解决了l,r的初始化问题。
            else if (cnt1 == 0) {
                l = a; cnt1 = 1;
            }
            else if (cnt2 == 0) {
                r = a; cnt2 = 1;
            }
            // a都不是这两者中之一
            else {
                cnt1--; cnt2--;
            }
        }
        cnt1 = 0, cnt2 = 0;
        for (auto a : nums) {
            if (a == l) cnt1++;
            else if (a == r) cnt2++;
        }
        vector<int> ans;
        if (cnt1 > nums.size() / 3) ans.push_back(l);
        if (cnt2 > nums.size() / 3) ans.push_back(r);
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值