leetcode 229. Majority Element II
题意:给你一个数组,让你找出里面出现次数大于[n/3]次的数,n是数组总数。
要求:时间复杂度O(n),空间复杂度O(1)
思路:题目感觉很熟悉,剑指offer里面有一道题目是找一个数组里面出现超过一般的数,往那方面想。
首先,出现超过[n/3]的数最多只有两个。
我们用a1,a2表示这两个数,num1,num2表示这个数出现的次数。
遍历整个数组,和a1,a2相同的话,num1,num2加1,不同的话减1;
a1,a2没有值得话赋值。
但是a1,a2出现的次数不一定超过[n/3],但是次数肯定是最多的两个。
最后再看看次数就好了。
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
vector<int> ans;
if(nums.size() == 0) return ans;
int cout1=0,cout2=0,num1 = -1,num2 = -1;
for(int i=0;i<nums.size();i++)
{
if( nums[i] == num1)
{
cout1++;
}
else if( nums[i] == num2)
{
cout2++;
}
else if(cout1 == 0 )
{
cout1++;
num1 = nums[i];
}
else if(cout2 == 0 )
{
cout2++;
num2 = nums[i];
}
else
{
cout1--;
cout2--;
}
}
cout1 = cout2 = 0;
for(auto n:nums)
if(n == num1)
cout1++;
else if(n == num2)
cout2++;
if(cout1 > nums.size() / 3) ans.push_back(num1);
if(cout2 > nums.size() / 3) ans.push_back(num2);
return ans;
}
};