主元素 II
给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一。
注意事项
数组中只有唯一的主元素
样例
给出数组[1,2,1,2,1,3,3] 返回 1
挑战
要求时间复杂度为O(n),空间复杂度为O(1)。
思路:这道题和上一道题思路基本一样,也是用抵消的方法,不过这个只保证主元素多于总元素的三分之一,而在一个数组中任意一个数出现次数大于n/3总数最多有两个,所以用抵消的方法找出两个最多的,再遍历一遍找出谁是主元素即可(其他大于主元素的k分之一方法都一样)
class Solution {
public:
/*
* @param nums: a list of integers
* @return: The majority number that occurs more than 1/3
*/
int majorityNumber(vector<int> &nums) {
// write your code here
int can1=0,can2=0,num1=0,num2=0;//找两个次数最多的数
for(auto n:nums)
{
if(num1==0)
{
can1=n;
num1++;
}
else if(can1==n)//一定紧跟(num==0)后,保证刚开始相同的数在一个里
num1++;
else if(num2==0)
{
can2=n;
num2++;
}
else if(can2==n)
num2++;
else
{num1--,num2--;
}
}
num1=num2=0;
for(auto n:nums)//第二次遍历
{
if(n==can1)
num1++;
else if(n==can2)
num2++;
}
return num1>num2? can1:can2;
}
};
主元素 II