Problem:
Solution:
求给定数组中出现次数超过n/2的元素,首先想到的是暴力法,也就是说遍历数组对每个元素的出现次数进行统计,如果出现次数一旦大于n/2即返回该书,此方法的时间复杂度为O(n^2)
class Solution {
public:
int majorityElement(vector<int>& nums) {
int len = nums.size();
int max = 0;
for (int i = 0;i < len;i++)
{
int temp = -1;
for (int j = 0;j < len;j++)
{
if (nums[i] == nums[j])
{
temp++;
if (temp >= len/2) return nums[i];
}
}
}
}
};
运行结果为时间超出限制
这里有一个被称为Moore voting algorithm的一个非常巧妙的算法,可以在线性时间内求出majority element,方法如下
class Solution {
public:
int majorityElement(vector<int>& nums) {
int len = nums.size();
int major;
int count = 0;
for (int i = 0;i < len;i++)
{
if (count == 0)
{
major = nums[i];
count++;
}
else if (major != nums[i]) count--;
else count++;
}
return major;
}
};