主元素 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;
}
};