【LeetCode/力扣】面试题 17.10. 主要元素(摩尔投票法)
作者:互联网
1 题目描述
题目链接:https://leetcode-cn.com/problems/find-majority-element-lcci/
数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。
示例 1:
输入:[1,2,5,9,5,9,5,5,5]
输出:5
示例 2:
输入:[3,2]
输出:-1
示例 3:
输入:[2,2,1,1,1,2,2]
输出:2
2 代码/C++
class Solution {
public:
int majorityElement(vector<int>& nums) {
int count = 0, c = -1; // 定义众数计数和候选
for(auto &p : nums){
if (count == 0){ // 当计数为0,则赋值当前数到候选c,计数加1
c = p;
count++;
}
else if (p == c){ // 当计数不为0,且当前值等于候选c,则计数加1
count++;
}
else{ // 当计数不为0,且当前值不等于候选c,则计数减一(抵消)
count--;
}
}
count = 0;
for (auto &p : nums){ // 二次遍历,计算候选c的出现次数
if (p == c){
count++;
}
}
return count*2 > nums.size()? c : -1; // 如果候选c超过一半则返回c,否则返回-1
}
};
3 代码解释
今天又学习到了一个方法,叫做“摩尔投票法”
摩尔投票法可以用于【查找列表中出现次数大于n/m的元素】
由于是寻找出现次数较多的元素,所以可以采用抵消法的思想
- 当查找出现次数超过n/2(本题,n为数组元数个数):
- (1)初始候选设置为首个元素,计数为0
- (2)遍历数组,相同则计数+1,不同则计数-1,当计数为0时说明前面元素均抵消,则记录下一个元素为候选
- (3)遍历结束后,如果存在符合要求的众数元素,则其值必定为候选,是否存在需要进行二次遍历才能判断
- 当查找出现次数超过n/3,变形题,思路类似,区别在于要分别设置两个候选及其计数,因为出现次数超过n/3的元数最多可能会有两个数
- 以此类推,涉及类似问题,就看m的大小,设置m-1个候选即可,遍历完毕后再对候选进行二次遍历判断即可
标签:count,力扣,面试题,遍历,nums,元素,候选,17.10,计数 来源: https://blog.csdn.net/baidu_35231778/article/details/118596771