169. 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.

Credits:

Special thanks to @ts for adding this problem and creating all test cases.


分析

分而治之。若nums只含一个数,则该数就是主元。若多于一个数,将nums分为两部分,若两部分都没有主元,则nums没有主元,若左右部分的主元相等,那么该数就是主元。若左右两边的主元不相等,扫描nums,统计该数的次数,若大于size/2,该数就是主元。


代码

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int size=nums.size();
        if (size==1)
        	return nums[0];
        vector<int> left=vector<int>(nums.begin(),nums.begin()+size/2);
        vector<int> right=vector<int>(nums.begin()+size/2,nums.end());
        int left_major=majorityElement(left);
        int right_major=majorityElement(right);
        int tem;
        if (left_major==-1&&right_major==-1) {
        	return -1;
		} else if (left_major==right_major) {
			return left_major;
		} else {
			if (left_major!=-1) {
				tem=left_major;
				int count = 0;
				for (int i = 0; i < size; ++i) {
					if (nums[i]==tem)
						count++;
				}
				if (count>size/2)
					return tem;
			}
			if (right_major!=-1) {
				tem=right_major;
				int count = 0;
				for (int i = 0; i < size; ++i) {
					if (nums[i]==tem)
						count++;
				}
				if (count>size/2)
					return tem;
			}
			return -1;
		}
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值