摩尔投票算法

本文对比了使用分治算法和摩尔投票算法解决LeetCode Majority Element问题的不同方法。分治算法虽然直观,但时间和空间复杂度较高。而摩尔投票算法仅需遍历一次数组,时间复杂度为O(n),空间复杂度为O(1),更高效地找到了众数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经过看别人的证明,我才知道这是一个算法,我昨天晚上刷leetcode时,Majority Element这道题,自己写了个分治算法,但是消耗内存特别大,时间也比较慢,题目是求众数,且保证众数的个数大于总数的一半。

class Solution {
public:
	map<int, int> merge_map(map<int, int> &left, map<int, int> &right)
	{
		map<int, int> var = right;
		for (map<int, int>::iterator iter = left.begin(); iter != left.end(); ++iter)
		{
			auto i = *iter;
			var[i.first]+=i.second;
		}
		return var;
	}


	map<int, int> Majority_Element(vector<int>::iterator A, int n)
	{
		if (n == 1) {
			map<int, int> a;
			a[*A] = 1;
			return a;
		}
		int mi = n / 2;
		map<int, int> left = Majority_Element(A, n / 2);
		map<int, int> right = Majority_Element(A + n / 2, n - n / 2);
		return merge_map(left, right);

	}

	int  find_max(const map<int, int> &res)
	{
		int num = 0;
		int var = 0;
		for (map<int, int>::const_iterator iter = res.cbegin(); iter != res.cend(); ++iter)
		{
			pair<int, int> curr = *iter;
			if (curr.second > num) {
				var = curr.first; 
				num = curr.second;
			}
		}
		return var;
	}

	int majorityElement(vector<int>& nums) {
		map<int, int> result = Majority_Element(nums.begin(), nums.size());
		
		return  find_max(result);
	}
};

上面是我的解法,其时间复杂度为T(N)=T(N/2)+T(N-N/2)+O(N/2)

在网上一搜,其实这是一个摩尔投票算法:

因为题目要求众数的个数大于一半,因此,每当有一对不同的数出现,我就互相抵消,删除,那么剩下的数必是最大的数。

因此我只需遍历一遍,且时间复杂度在O(n),空间复杂度为O(1)

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int result= 0,count= 0;
        for(int num:nums){
            if(count== 0) {result= num;++count;}
            else (num == result) ? ++count: --count;
        }
        return result;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值