主元素 II
题目
给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一。
注意事项
数组中只有唯一的主元素样例
给出数组[1,2,1,2,1,3,3] 返回 1
挑战
要求时间复杂度为O(n),空间复杂度为O(1)。
题解
思路和46.Majority Number-主元素(容易题)的一致,如果发现3个不一样的数就进行消掉。记录两个candidate和每个candidate分别的出现次数。如果遍历到的数和两个candidate都不等,就将其对应的count都减1。最后将两个candidate再遍历一次验证一下谁出现的次数多谁就是主元素。
public class Solution
{
/**
* @param nums:
* A list of integers
* @return: The majority number that occurs more than 1/3
*/
public int majorityNumber(ArrayList<Integer> nums)
{
int candidate1 = 0, candidate2 = 0;
int count1 = 0, count2 = 0;
for (int i = 0; i < nums.size(); i++)
{
if (candidate1 == nums.get(i) || count1 == 0)
{
count1++;
candidate1 = nums.get(i);
}
else if (candidate2 == nums.get(i) || count2 == 0)
{
count2++;
candidate2 = nums.get(i);
}
else
{
count1--;
count2--;
}
}
count1 = 0;
count2 = 0;
for (int j = 0; j < nums.size(); j++)
{
count1 += (candidate1 == nums.get(j)) ? 1 : 0;
count2 += (candidate2 == nums.get(j)) ? 1 : 0;
}
return count1 > count2 ? candidate1 : candidate2;
}
}
Last Update 2016.9.30