169. Majority Element

来源:互联网 发布:网络诈骗300元立案吗 编辑:程序博客网 时间:2024/05/18 14:44

问题描述:

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.

给一个长为n的数组,找到该数组的众数。众数是指数组中出现超过n/2次的元素。

假设数组不为空且数组存在众数。

问题解决:

运用分治算法

每次把数组分成前后两部分,分别找到前后两部分的众数

若都有众数且众数相同,则该数就是整个数组的众数;

若前部分有众数或者后部分有众数,则遍历整个数组,计算其出现的次数是否超过n/2,是则返回该数;

若还是找不到众数,则数组无众数,返回一个相对比较偏僻的数字-10000

如上递归下去,当数组长度缩小为1时,数组中的唯一的数就是该数组的众数

代码如下:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        vector<int>::iterator iter1;
        int len = nums.size();

//若长度为1,则数组里的数字就是该数组的众数
        if(len == 1) {
            return *nums.begin();
        } else {
            vector<int> f, b;
            int i = 0;

    //新建两个子数组,分别存当前数组的前半部分和后半部分
            for(iter1=nums.begin(); i < len/2; iter1++, i++) {
                f.push_back(*iter1);
            }
            for(; iter1!=nums.end(); iter1++) {
                b.push_back(*iter1);
            }

    //递归求子数组的众数
            int fM = majorityElement(f);
            int bM = majorityElement(b);

    //若众数相同,返回
            if(fM == bM) {
                return fM;
            } 
            int numf = 0, numb = 0;

    //若前半部分有众数,计算其出现的次数
            if(fM != -10000) {
                for(iter1=nums.begin(); iter1!=nums.end(); iter1++) {
                    if(*iter1 == fM) {
                        numf++;
                    } 
                }

//若出现超过n/2则返回
                if(numf > len/2) return fM;
            }

    //若后半部分有众数,计算其出现的次数
            if(bM != -10000) {
                for(iter1=nums.begin(); iter1!=nums.end(); iter1++) {
                    if(*iter1 == bM) {
                        numb++;
                    } 
                }

//若出现超过n/2则返回
                if(numb > len/2) return bM;
            }

   //找不到则返回-10000
            return -10000;
        }
    }
};

原创粉丝点击