leetcode 169. Majority Element
题意:数组长度为N,找出数组中元素出现个数大于N/2 的众数
法一:先排序,再来一次遍历硬数一下
class Solution
{
public:
int majorityElement(vector<int>& nums)
{
if (nums.size() == 1) return nums[0];
int ret = 1,val,tmp=1;
sort(nums.begin(),nums.end());
for (int i=1; i<nums.size(); i++)
{
if (nums[i] == nums[i-1])
{
tmp++;
if (tmp > ret)
{
ret = tmp;
val = nums[i];
}
}
else
{
tmp = 1;
}
}
return val;
}
};
法二:Moore Voting Algorithm算法,动画在这里:http://www.cs.utexas.edu/~moore/best-ideas/mjrty/example.html#step12 看了动画就能理解了
class Solution
{
public:
int majorityElement(vector<int>& nums)
{
int elem = nums[0],ct = 1;
for (int i=1; i<nums.size(); i++)
{
if (ct == 0)
{
elem = nums[i];
ct = 1;
}
else if (nums[i] == elem)
{
ct++;
}
else if (nums[i] != elem)
{
ct--;
}
}
return elem;
}
};
法三:随机数,
class Solution
{
public:
int majorityElement(vector<int>& nums)
{
if (nums.size() == 1)return nums[0];
while (1)
{
int pos = rand()%(nums.size() -1);
int ct = 0;
for (int i=0; i<nums.size(); i++)
{
if (nums[i] == nums[pos])ct++;
}
if (ct > nums.size()/2 )
return nums[pos];
}
}
};

浙公网安备 33010602011771号