您的位置:首页 > 其它

[leetcode] 169.Majority Element

2015-08-18 15:43 330 查看
题目:

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.

题意:

给一个数组,找出其中出现次数超过n/2的数字。

思路:

这道题可以使用多种方法进行解决。

最经典的方法自然是Moore Voting算法,给一个计数器用来投票,初始化为0,从前往后扫描数组,如果计数器是0,那么将当前扫描到的数字保存为当前最多的,并且让计数器加1。如果扫描到当前数字时,计数器不是0,那么分两种情况,如果当前数字与当前出现最多次数的数字一样,那么使计数器加1,否则计数器减一。最终留下的数就是出现超过一半的数。

代码如下:

class Solution {
public:
int majorityElement(vector<int> &num) {
int index = 0;
int count = 0;
for (int i = 0; i < num.size(); i++){
if (count == 0)index = i;
if (num[index] != num[i])count--;
else count++;
}
return num[index];
}
};


第二种方法可以采用位操作的方法。很明显我们可以把每个数字分成32个bit位来进行细致观察。同样的道理,某个bit位出现的次数超过一半,那么那个出现次数超过一半的那个数字的该bit位肯定就是这个值。

代码如下:

class Solution {
public:
int majorityElement(vector<int> &num) {
int result = 0;
int size = num.size();
size >>= 1;
for(int i = 0, mask = 1; i < 32; i++, mask <<= 1) {
int count = 0;
for(auto j : num) {
if(mask & j)count++;
if(count > size) {
result |= mask;
break;
}
}
}
return result;
}
};


当然还可以使用分治的方法,两半都找出一个最长的,然后判断是不是超过一半次数的。代码略去。

可以先排序。

还可以使用一种随机挑选数的方法,随便找一个数,然后遍历计数一遍查看是不是次数超过了一半。代码略去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: