【leetcode】169. Majority Element(easy 一次ac)

本文介绍了一种使用哈希表解决LeetCode上169题 Majority Element 的方法,通过记录每个数字出现的次数来找出出现次数超过数组长度一半的数字,并对比了摩尔投票法的高效实现。

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

虽然效率较低,但是一次ac了。
找数组中出现次数大于一半数组大小的数字。

// 169. Majority Element
int Solution::majorityElement(vector<int>& nums)
{
	unordered_map<int, int> m;
	for (int i = 0; i < nums.size(); ++i)
	{
		unordered_map<int, int>::iterator f = m.find(nums[i]);
		if (f != m.end())
		{
			f->second++;
			if (f->second >(nums.size() / 2))
				return f->first;
		}
		else
		{
			m.insert(make_pair(nums[i], 1));
		}
	}
	return nums[0];
}

Runtime: 24 ms, faster than 60.45% of C++ online submissions for Majority Element.
Memory Usage: 11.4 MB, less than 34.29% of C++ online submissions for Majority Element.

当然这道题目有更快的方法,参考摩尔投票法,就是抵消的思想,如果两个数字不相同,就抵消掉,然后剩下的最后一个肯定是符合条件的

https://leetcode.com/problems/majority-element/discuss/51613/O(n)-time-O(1)-space-fastest-solution

class Solution {
public:
    int majorityElement(vector<int>& nums) {
       int major = nums[0];
	int count = 1;

	for (int i = 1; i < nums.size(); ++i)
	{
		if (nums[i] == major)
		{
			count++;
			if (count > nums.size() / 2)
				return major;
		}
		else
		{
			count--;
			if (count == 0)
            {
				major = nums[i +1];
                ++i;
                count = 1;   
            }
		}

	}
	return major;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值