Description
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/2次。所以很自然地想到进行排序后,中间的数就是该元素。代码如下:
class Solution {
public:
int majorityElement(vector<int>& nums) {
sort(nums.begin(), nums.end());
return nums[nums.size() / 2];
}
};
如果使用分治法的思想,可以将区间一分为二,对左右两边都寻找出现次数最多的元素。即使某一边的majority element不是正确的解,但是由于这个元素在整个区间出现的次数超过了n/2次,所以另外一边的majority element一定是正确的解。
最后需要从左右两边的majority element中选出正确的解。想了很久没有什么很好的办法,最后决定使用遍历计数的方法,求出这两个数在左右区间出现的总次数,选出出现最多的数即可。
代码如下:
class Solution {
public:
int majorityElement(vector<int>& nums) {
return majorityElementInRange(nums, 0, nums.size() - 1);
}
private:
int majorityElementInRange(vector<int>& nums, int from, int to) {
if (from == to)
return nums[from];
int mid = from + (to - from) / 2;
int left = majorityElementInRange(nums, from, mid);
int right = majorityElementInRange(nums, mid + 1, to);
int leftCount = countInRange(nums, left, from, to);
int rightCount = countInRange(nums, right, from, to);
return leftCount >= rightCount ? left : right;
}
int countInRange(vector<int>& nums, int search, int from, int to) {
int count = 0;
for (int i = from; i <= to; i++)
if (nums[i] == search)
count++;
return count;
}
};
代码中使用mid = low + (high - low) / 2而不使用mid = (low + high) / 2的原因是后者可能会出现整数溢出的问题。