题目:
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的数字最多不超过两个,所以只要记录这两个数字以及它们的的出现次数就行,(num1,count1),(num2,count2)。具体做法先从头遍历这个数组,如果nums[i]等于num1或num2那么对应的count就自加。如果没有上述情况,再看count1和count2中有没有是0的,有的话将nums[i]赋值给对应的num1或num2,然后将count1或count2赋值为1。如果以上情况均没有出现,那么将count1和count2分别减1。
结束上述过程之后,再遍历一遍数组,找到num1和num2的出现次数。判断是否大于n/3返回即可。
代码:
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
int v_size=nums.size();
vector<vector<int>> result;
vector<int> majority;
bool insert_flag=false;
result.resize(2);result[0].resize(2,0);result[1].resize(2,0);
for (int i=0;i<nums.size();i++)
{
for (int j=0;j<result.size();j++)
{
if (result[j][0]==nums[i])
{
result[j][1]++;
insert_flag=true;
break;
}
}
for (int j=0;j<result.size() && !insert_flag;j++)
if (result[j][1]==0)
{
result[j][0]=nums[i];result[j][1]=1;
insert_flag=true;
break;
}
if (!insert_flag)
{
for (int j=0;j<result.size();j++)
result[j][1]--;
}
insert_flag=false;
}
result[0][1]=0;result[1][1]=0;
for (int i=0;i<nums.size();i++)
{
for (int j=0;j<result.size();j++)
if (result[j][0]==nums[i])
{
result[j][1]++;
break;
}
}
for (int j=0;j<result.size();j++)
{
if (result[j][1]>floor((float)v_size/3))
{
majority.push_back(result[j][0]);
}
}
return majority;
}
};
结果: