题目:
这题的哈希表判定和排序找数组中点元素的方法都很好想。
就是这个投票模拟法太秀了:
我们假设每个人写的数字都是一张选票。那么这个要找的就是胜出的人。那么怎么算最快呢?
直接判断相邻数字是否相同就好了
比如3 1 1,一开始假设众数是3,vote(票数)设定为1,但是遇到了1,票数-1.此时已经没有票了。因此需要将众数设定为下一个1,vote设定为1,最后返回这个众数就行了。
再比如,3,3,3,1,1,2,4,3,3一开始假设众数是3,vote设定为1,连续两票3,因此vote = 3。1,1,2抵消了vote的3票,因此众数重置为4,vote重置为1.但是接下来的3又抵消了这一票。于是只剩下3一票了。
注:当众数的个数刚好为数组长度的一半时,此算法失效。
C++代码附带测试:
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
int majorityElement(vector<int>& nums) {
int x = nums[0];
int vote = 1;
for(int i=1;i<nums.size();i++){
if(vote==0){
x = nums[i];
vote = 1;
continue;
}
if(nums[i]!=x){
vote--;
}else{
vote++;
}
}
return x;
}
};
int main(){
vector<int> nums = {3,3,3,1,1,2,4,3};
Solution solution;
cout<<solution.majorityElement(nums);
}
补一个摩尔投票法更容易理解的解释: