leetcode题目:
首先我用用了个Map,一旦出现计数超过数组长度一半,直接return。通过。
但是觉得这道题的关键之处在于一个数组中计数超过数组长度一半的数字只可能存在一个。
网上查了一通,知道了摩尔投票法的算法,学习了一下:
摩尔投票法的基本思想很简单,在每一轮投票过程中,从数组中找出一对不同的元素,将其从数组中删除。这样不断的删除直到无法再进行投票,如果数组为空,则没有任何元素出现的次数超过该数组长度的一半。如果只存在一种元素,那么这个元素则可能为目标元素。
下面是c++代码
class Solution {
public:
int majorityElement(vector<int>& nums) {
int major = -1;
int count = 0;
for (int i = 0; i < nums.size(); i++) {
if (count == 0) {
major = nums[i];
count++;
} else {
if (nums[i] == major) {
count++;
}else {
count--;
}
}
}
return major;
}
};
执行结果: