LEETCODE 169

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.


这道题和以前看到的一个求谁发的帖子有点像。

思路:

如果有一个元素A超过了一半,那么任何情况下,去除两个不同的数字以后,A仍然超过一半。设总数为sum, A的数值为a;那么有a/sum >1/2,,即2a>sum;

第一种情况:去除的两个不包括A元素,则有总数变为sum-2,A元素个数不变,那么就有a/(sum-2)?1/2,很明显,即判断2a和sum-2的值,有2a>sum-2;

第二种情况:去除的两个有一个A元素,则有总数变为sum-2,A元素个数变为a-1,那么就有(a-1)/(sum-2)?1/2,即判断2(a-1)和sum-2的大小,即2a和sum的关系。


程序设计:

刚开始我是利用双指针,一个从前遍历,一个从后遍历,那么最差的情况即遍历N/2次就会找到,但是忽略了以下排列情况:

9 9 10 10 10 9 9 

后来改变了思路,如果当前两个相等,则判断前遍历当前点和当前点后一个是否相等,如果不等,就去除当前点和当前点后一点。具体的数学证明还没有想通;

class Solution {
public:
    int majorityElement(vector<int>& nums) {
   while(nums.size() > 1)
		{
			bool flag = false;
			for (int i = 0; i < nums.size()/2; ++i)
			{
				if (nums[i] != nums[nums.size() - 1 - i])
				{
					nums.erase(nums.begin()+ nums.size() - 1 - i);
					nums.erase(nums.begin() + i);
					flag = true;
					break;
				}
				if (nums[i] != nums[i+1])
				{
					nums.erase(nums.begin() + i + 1);
					nums.erase(nums.begin() + i );
					flag = true;
					break;
				}
				
			}
			if (flag == false)
				return nums[0];
		}
		return nums[0];
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值