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.
数组求过半数的元素。
做到这道题的时候,心里也是一阵痛,因为上学期算法期末考刚好有这样一道题,而且有空间的限制。
当时想着用map来实现,时间上是快啊。但是不用想,那么大的数据,空间肯定会爆。
LeetCode上的这个解法只用维护两个变量,而且时间也是O(n):
Runtime: O(n) — Moore voting algorithm: We maintain a current candidate and a counter initialized to 0. As we iterate the array, we look at the current
element x:
If the counter is 0, we set the current candidate to x and the counter to 1.
If the counter is not 0, we increment or decrement the counter based on whether x is the current candidate.
After one pass, the current candidate is the majority element. Runtime complexity = O(n).
源代码:
int majorityElement(vector<int> &num) {
int counter=0, candidate;
for (int i = 0; i < num.size(); i++) {
if (counter == 0) {
candidate = num[i];
counter++;
}
else {
if (num[i] == candidate)
counter++;
else
counter--;
}
}
return candidate;
}