您的位置:首页 > 其它

leetcode(169)Majority Element

2016-09-23 21:53 330 查看
题意:找出数组中的主元素(出现次数超过[n/2]的元素)

分析:这道题比较有意思,解法很多而且很巧妙,搜集了一些网上介绍的方法,时间复杂度都是O(n)。

1、成对删除。不断把两个不同元素删除,因为主元素次数超过[n/2],所以最后一定剩下至少一个元素,剩下的这些元素就是主元素。

2、随机数法。随机选择一个元素,判断它出现的次数是否超过[n/2]。因为主元素的个数超过n/2,所以理论上平均每取两次就能找到一个主元素。

3、位运算法。用二进制形式来理解数组里的数。用32位二进制来表示数组中的元素,然后对于这32位的每一位,统计数组中的所有元素在这一位为1的个数,如果超过n/2,主元素的这一位也为1,否则主元素的这一位为0,所以可以算出主元素的二进制中哪些位是1,哪些位是0,从而得到主元素的值。结论成立的原因是:如果主元素的二进制表示中的某一位为1,因为主元素个数超过n/2,所以数组中的所有元素在这一位为1的个数超过n/2;如果主元素的二进制表示中的某一位为0,那么数组中的所有元素在这一位为0的个数超过n/2,所以在这一位为1的个数少于等于n/2.

代码(用成对删除法):

class Solution {
public:
int majorityElement(vector<int>& nums) {
if(nums.size()==0) return 0;
int result=nums[0];
int count=0;
for(int i=0;i<nums.size();i++)
{
if(count==0)//从0到i-1都成对删除完,重新选一个剩下的元素
{
result=nums[i];
count++;
}
else
{
if(nums[i]!=result)//把nums[i]和前面某个未删掉的元素成对删掉
{
count--;
}
else count++;//两个相等元素不删
}
}
return result;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: