时间O(n),空间O(1)
LeetCode 169. 找出数组中出现次数超过n/2次的数
http://blog.youkuaiyun.com/chfe007/article/details/42919017
基本原理:每次都找出一对不同的元素,从数组中删掉,直到数组为空或只有一种元素。 不难证明,如果存在元素e出现频率超过半数,那么数组中最后剩下的就只有e。
LeetCode 229. 找出数组中出现次数超过n/3次的数
基本原理:每次都找出3个互不相同的元素,从数组中删掉。最后留下2个数,重新扫描一遍确认下就可以了。
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
vector<int> ret;
size_t n = nums.size();
int a = 0, b = 0, cnt_a = 0, cnt_b = 0;
for (auto ite: nums)
{
if (a == ite) ++cnt_a;
else if (b == ite) ++cnt_b;
else
{
if (cnt_a == 0)
{
a = ite;
cnt_a = 1;
}
else if (cnt_b == 0)
{
b = ite;
cnt_b = 1;
}
else
{
--cnt_a;
--cnt_b;
}
}
}
cnt_a = 0;
cnt_b = 0;
for (auto ite: nums)
{
if (a == ite) ++cnt_a;
else if (b == ite) ++cnt_b;
}
if (cnt_a > n / 3) ret.push_back(a);
if (cnt_b > n / 3) ret.push_back(b);
return ret;
}
};