摩尔投票算法
[PS:摩尔投票思想其实就是一组数据nums[n],其中有一个数a的数量大于等于n/2,这组数据竞争找出那个a,本身思想很简单,我把它放过来主要以为,摩尔投票提供了很好的时间复杂度O(n),和空间复杂度O(1)。]
思想:在我们求一组数据中大于等于n/2的数时,可以用排序遍历,或者排序求中位数,或者用map(hash),但是相应时间和空间复杂度都不是很满意,用摩尔就是取众数+1,非众数-1,最后加下来必定>1,也就找出了众数。
算法流程:
1.首先假设第一个数为众数temp=nums[0],count=1,
2.往后遍历遇到与这个数相同则count+1,负责count-1,
3.若count==0时,将下一个数置为temp,同时count=1,
4.重复上述步骤。
5.最后temp中就是众数
代码:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int temp = max; //这边取max其实是怕万一nums中有和temp相等的
int count = 0;
for (int num : nums) {
if (num == temp)
count++;
else {
if(count!=0) count--;
else{
temp==num;
count=1;
}
}
}
return temp;
}
};
补充
当然还有找出所有>=n/3的,同样可以用投票,不过这时候需要设置,两个起始数,因为最多只有2个数a,b,这两个数不互相竞争并且共进退,也就是如果后面遇到不是a,b,那么a,b的count都要减1,如果遇到a,b,这两个数相应的count+1,另外,开始的时候要选择两个不一样的起始,自己加个判断就好了。算法思想大同小异,就不写了。
还有如果只是单独想找出最多,可以用hash之类的。