11
04/2015
[LeetCode] Majority Element
Majority Element
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.
You may assume that the array is non-empty and the majority element always exist in the array.
解题思路:
1、用一个map记录每个数的出现的次数。若出现某个数的计数大于n/2,返回该数。
class Solution {
public:
int majorityElement(vector<int> &num) {
int len = num.size();
map<int, int> count;
for(int i=0; i<len; i++){
count[num[i]]++;
if(count[num[i]] > len/2){
return num[i];
}
}
return 0;
}
};2、对于一个排序数组来说,若众数存在,众数肯定是中间那个数。
class Solution {
public:
int majorityElement(vector<int> &num) {
std::sort(num.begin(), num.end());
return num[num.size()/2];
}
};3、投票算法。可以想成打擂台,台上那个人若输赢次数相同,则下台,最后打败他的人上台。众数肯定是最后的赢家。这个算法用的时间最少了。
class Solution {
public:
int majorityElement(vector<int> &num) {
int len = num.size();
if(len==0){
return 0;
}
int candidate = num[0];
int count = 1;
for(int i=1; i<len; i++){
if(num[i]==candidate){
count++;
}else{
count--;
}
if(count==0){
candidate = num[i];
count=1;
}
}
return candidate;
}
};4、位算法。考虑到每个数都可以用32位二进制表示,对每个数的每一位二进制为1的计数,若某个二进制位的计数大于n/2,肯定有众数的贡献。这种办法很新颖,虽然速度比不上投票算法,但是开拓思维嘛。这里说一点,第一种方法中,定义了map<int, int> count,对于每个新加入的键值,其值默认为0,但是对于int数组类型,每个数组初始化为随机值,因此要用memset函数呀。
class Solution {
public:
int majorityElement(vector<int> &num) {
int len = num.size();
if(len==0){
return 0;
}
int bitCount[32];
memset(bitCount, 0, 32*sizeof(int));
for(int i=0; i<len; i++){
for(int j=0; j<32; j++){
if(num[i]&(1<<j)){ //第j位是1
bitCount[j]++;
}
}
}
int result=0;
for(int i=0; i<32; i++){
if(bitCount[i] > len/2) //第i位为1的计数大于一半,肯定有众数的贡献
result += (int)pow(2, i);
}
return result;
}
};二次刷题(2015-08-06)
投票算法:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int result = 0;
int count = 0;
int len = nums.size();
for(int i=0; i<len; i++){
if(count == 0){
result = nums[i];
count++;
}else if(result == nums[i]){
count++;
}else{
count--;
}
}
return result;
}
};转载请注明:康瑞部落 » [LeetCode] Majority Element

0 条评论