题目要求线性时间和常量空间,网上看见都是用摩尔投票算法,算是大概想通了,记录一下。
算法思想:
1.根据题目要求,设n个候选值key和对应的次数time,初始设为0;
2.第一次遍历数组,若array[i] == key,++time;
若不等,再看time,若time == 0,则用array[i]取代key,++time;
若time != 0,则--time;
3.第二次遍历数组,检查key是否真的在数组中出现了多次。
一直纠结于--time会不会遗漏某个值,后来觉得算法能成功应该是某个值出现的次数一定会有那么多,所以--time并不会遗漏掉,只是说第一次统计的次数并不准确,所以需要第二次遍历来做验证。
代码如下:
<span style="font-size:24px;">class Solution {
public:
vector<int> majorityElement(vector<int>& nums)
{
int nFir = 0;
int nFTime = 0;
int nSec = 0;
int nSTime = 0;
int nLen = nums.size();
vector<int> tmp;
for (int i = 0; i < nLen; ++i)
{
if (nums[i] == nFir)
{
++nFTime;
}
else if (nums[i] == nSec)
{
++nSTime;
}
else if (nFTime == 0)
{
nFir = nums[i];
++nFTime;
}
else if (nSTime == 0)
{
nSec = nums[i];
++nSTime;
}
else
{
--nFTime;
--nSTime;
}
}
nFTime = 0;
nSTime = 0;
for (int i = 0; i < nLen; ++i)
{
if (nums[i] == nFir)
{
++nFTime;
}
else if (nums[i] == nSec)
{
++nSTime;
}
}
if (nFTime > nLen/3)
{
tmp.push_back(nFir);
}
if (nSTime > nLen/3)
{
tmp.push_back(nSec);
}
return tmp;
}
};</span>