每天一道LeetCode-----摩尔投票法寻找给定数组中出现个数大于n/2或n/3的元素
程序员文章站
2024-03-16 14:34:16
...
Majority Element
原题链接Majority Element
给定一个数组,元素个数为n,找出出现次数大于n/2的那个元素
摩尔投票法思想
每次从数组中选择两个不相等的元素进行相互抵消(删除),最后剩下的一个元素或几个相同的元素就是出现次数大于n/2的元素
代码如下
class Solution {
public:
int majorityElement(vector<int>& nums) {
int major = 0, count = 0;
for(auto& n : nums)
{
if(major == n) ++count;
else if(count == 0) major = n, count = 1;
else --count;
}
return major;
}
};
Majority Element II
找到所有出现次数大于n/3的元素,显然最多只能有两个,同样利用摩尔投票法
代码如下
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
int y = 0, z = 0, cy = 0, cz = 0;
for(auto& x : nums)
{
if(y == x) ++cy;
else if(z == x) ++cz;
else if(cy == 0) y = x, cy = 1;
else if(cz == 0) z = x, cz = 1;
else --cy, --cz;
}
cy = cz = 0;
for(auto& x : nums)
{
if(y == x) ++cy;
else if(z == x) ++cz;
}
vector<int> res;
if(cy > nums.size() / 3) res.push_back(y);
if(cz > nums.size() / 3) res.push_back(z);
return res;
}
};