问题描述:
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;
}
}
};