题目
已知一个数组中存在一个众数,请找出这个众数。众数是指一个数组中的数出现的次数超过数组长度的一半。
思路
看到这道题的第一眼,想到的方法是,遍历数组,给每个数计数,然后找到数量最多的数返回。这个算法的时间和空间复杂度都是O(n)。没想到还有更优秀的做法。这个方法就是摩尔投票法。摩尔投票法的思路就是,遍历数组,也是给数计数,不过有点不一样。
首先任选一个候选人,计数为1,一般都是从第一个数开始。遇到相同的数就加1,遇到不同的就减1,如果计数为0,则把当前的数作为候选人,计数为1。重复这个过程到数组的最后。候选人就是答案。时间复杂度为O(n),空间复杂度为O(1)
代码
class Solution {
public:
int majorityElement(vector<int>& nums) {
int count = 1;
int maj = nums[0];
for(int i = 1;i < nums.size();i++) {
if (nums[i] == maj) {
count++;
}
else {
if (count == 0) {
maj = nums[i];
count++;
}
else {
count--;
}
}
}
return maj;
}
};