一. 题目描述
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
。
开始的思路,自然是对数组进行排序,数组最中间的元素就是主元素,但算法复杂度一般需要:O(nlogn)
;若允许辅助内存,可新建一个数组,用于存放不同元素值在数组中存放的次数,这样只需遍历一次原数组,然后再遍历一次记录次数的数组就可找出主元素,算法复杂度为O(n)
。
一种高效的方法只需遍历一次数组即可。我们知道主元素出现的次数比其他元素出现的次数和还要大,因此,只需使用两个变量:candidate
和 count
这两个变量记录了元素candidate
的值,count
记录了元素candidate
比其他元素多出现的次数。
遍历数组,遇到与当前记录元素candidate
相同的元素值,++count
;否则count
被抵消一次,--count
。当count
变为0
时,更换candidate
为当前遍历所在的像素值。
由于遍历完数组后,主元素被抵消的次数count
比然大于零,不会因为当count
变为0
而被其他数组元素替代,因此candidate
也只会是主元素。
三. 示例代码
class Solution {
public:
int majorityElement(vector<int>& nums) {
int candidate = 0, count = 0;
for (int i = 0; i < nums.size(); ++i)
{
if (count == 0)
{
candidate = nums[i];
++count;
}
else
{
if (candidate == nums[i])
++count;
else
--count;
}
}
return candidate;
}
};