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;
}
};
分析:这道题比较有意思,解法很多而且很巧妙,搜集了一些网上介绍的方法,时间复杂度都是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;
}
};
相关文章推荐
- 【LeetCode】169.Majority Element (Easy)
- LeetCode-169-Majority Element-E
- Leetcode题解 169. Majority Element
- LeetCode 169. Majority Element (Easy)
- LeetCode(169)Majority Element
- <LeetCode OJ> 169. Majority Element
- leetcode 169. Majority Element | 摩尔投票法
- LeetCode 169.Majority Element
- 2018.03.07 leetcode 打卡 #169. Majority Element
- [leetcode]: 169. Majority Element
- leetcode 169 Majority Element 冰山查询
- LeetCode 169: Majority Element
- [Leetcode从零开刷]169.Majority Element
- LeetCode169 Majority Element, LintCode47 Majority Number II, LeetCode229 Majority Element II, LintCode48 Majority Number III
- leetcode 169 Majority Element 冰山查询
- LeetCode 169. Majority Element - majority vote algorithm (Java)
- 算法系列(13) Leetcode 169 Majority Element
- LeetCode__169. Majority Element
- Leetcode-169 Majority Element
- LeetCode 169. Majority Element