LeetCode-169&229.Majority Element

169 https://leetcode.com/problems/majority-element/

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.

方法1

排序后双指针

int majorityElement(vector<int>& nums) 
{
	int n = nums.size();
	sort(nums.begin(),nums.end());
	int p1 = 0, p2 = n / 2 - (1 - n % 2);
	while (p2<n)
	{
		if (nums[p1] == nums[p2])
			return nums[p1];
		p1++;
		p2++;
	}
	return nums[0];
}

其实,nums已排序为前提,细想就可以得出以下结论(假设结果为res),

1,如果n为偶数,要么res是前半段,要么是后半段,要么跨越中间

2,如果n为奇数,要么res是前半段,要么是后半段,要么跨越中间。不论哪一段肯定包含中间的数

int majorityElement(vector<int>& nums) 
{
	int n = nums.size();
	sort(nums.begin(),nums.end());
	int p = n / 2;
	if (n % 2 == 0)
	{
		if (nums[0] == nums[p-1])
			return nums[0];
		return nums[p];
	}
	else
	{
		return nums[p];
	}
}

简化后 

int majorityElement(vector<int>& nums) 
    {
        int n = nums.size();
    	sort(nums.begin(),nums.end());
    	int p = n / 2;
    	if (n % 2 == 0&& nums[0] == nums[p - 1])
            return nums[0];
    	return nums[p];
    }
下面的代码也能通过测试,但是实际是不对的,当输入是1 1 2 3就不对

int majorityElement(vector<int>& nums) 
    {
    	sort(nums.begin(),nums.end());
    	return nums[nums.size()/2];
    }


Boyer-Moore最大投票算法 参考https://segmentfault.com/a/1190000004905350

int majorityElement(vector<int>& nums) 
    {
    	int n = nums.size();
    	int major = nums[0], count = 1;
    	for (int i = 1; i<n; i++) 
    	{
    		if (count == 0) 
    		{
    			count++;
    			major = nums[i];
    		}
    		else if (major == nums[i]) 
    			count++;
    		else 
    			count--;
    	}
    	return major;
    }


229 https://leetcode.com/problems/majority-element-ii/

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

vector<int> majorityElement(vector<int>& nums) 
    {
        int n = nums.size();
    	int num1 = 0, num2 = 0, n1 = 0, n2 = 0;
    	for (int num:nums)
    	{
    		if (num == num1)
    			n1++;
    		else if (num == num2)
    			n2++;
    		else if (n1 == 0)
    		{
    			n1++;
    			num1 = num;
    		}
    		else if (n2 == 0)
    		{
    			n2++;
    			num2 = num;
    		}
    		else
    		{
    			n1--;
    			n2--;
    		}
    	}
    	n1 = n2 = 0;
    	for (int num : nums)
    	{
    		if (num == num1)
    			n1++;
    		else if (num == num2)
    			n2++;
    	}
    	vector<int> res;
    	if (n1 > n / 3)
    		res.push_back(num1);
    	if (n2 > n / 3)
    		res.push_back(num2);
    	return res;
    }
参考

https://segmentfault.com/a/1190000004905350

https://leetcode.com/discuss/42806/boyer-moore-majority-vote-algorithm-generalization

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值