给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一。
注意事项
数组中只有唯一的主元素
您在真实的面试中是否遇到过这个题?
Yes
样例
给出数组[1,2,1,2,1,3,3] 返回 1
挑战
要求时间复杂度为O(n),空间复杂度为O(1)。
标签
class Solution {
public:
/**
* @param nums: A list of integers
* @return: The majority number occurs more than 1/3.
*/
int majorityNumber(vector<int> nums) {
// write your code here
int temp[3],count[3]={1,0,0};
temp[0]=nums[0];
int flag=0;
int min=0;
int max=0;
int n=nums.size();
for(int i=1;i<n;i++){
flag=0;
for(int j=0;j<3;j++){
min=count[j]>count[min]?min:j;
}
for(int j=0;j<3;j++){
if(nums[i]==temp[j]){
count[j]++;
flag=1;
break;
}
}
if(1==flag)
continue;
else {
if(count[min]==0){
count[min]=1;
temp[min]=nums[i];
continue;
}
else{
for(int j=0;j<3;j++){
count[j]-=count[min];
}
count[min]=1;
temp[min]=nums[i];
}
}
}
for(int j=0;j<3;j++){
min=count[j]>count[min]?min:j;
}
if(count[min]!=0)
for(int j=0;j<3;j++)
count[j]-=count[min];
int c1=1,c2=1,num1,num2;
for(int i=0;i<3;i++){
if(count[i]>0&&1==c1){
num1=temp[i];
c1=0;
}
else if(count[i]>0){
num2=temp[i];
c2=0;
}
}
if(1==c2)
return num1;
for(int i=0;i<n;i++){
if(nums[i]==num1)
c1++;
if(nums[i]==num2)
c2++;
}
max=c1>c2?num1:num2;
return max;
}
};