Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times. The algorithm should run in linear time and in O(1) space.
给一个数组,找出所有出现次数超过 n/3次的元素。要求线性时间复杂度,常数空间复杂度。
因为出现次数超过n/3次,所以结果最多只有两个元素。
用两个变量存储,两个变量记录出现次数。
扫描数组,和a或b相等时对应计数变量加1,否则若计数变量有0,则替换计数为0的变量。
如果都不属于上面两种情况则计数变量都减1。
这样最后的两个结果不一定都是出现次数超过n/3次的数,但出现次数超过n/3次的数一定在这两个结果中。
由于可能只有一个出现次数超过n/3次的数,所以最后要对两个数都进行一下检查。
试试新写法。
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
int a, b, c1 = 0, c2 = 0;
for(auto now : nums)
{
if(now == a) c1++;
else if(now == b) c2++;
else if(c1 == 0) a = now, c1 = 1;
else if(c2 == 0) b = now, c2 = 1;
else c1--, c2--;
}
c1 = c2 = 0;
for(auto now : nums)
{
if(now == a) c1++;
else if(now == b) c2++;
}
vector<int> res;
if(c1 > nums.size() / 3) res.push_back(a);
if(c2 > nums.size() / 3) res.push_back(b);
return res;
}
};