[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,否则计数器减一。最终留下的数就是出现超过一半的数。
代码如下:
第二种方法可以采用位操作的方法。很明显我们可以把每个数字分成32个bit位来进行细致观察。同样的道理,某个bit位出现的次数超过一半,那么那个出现次数超过一半的那个数字的该bit位肯定就是这个值。
代码如下:
当然还可以使用分治的方法,两半都找出一个最长的,然后判断是不是超过一半次数的。代码略去。
可以先排序。
还可以使用一种随机挑选数的方法,随便找一个数,然后遍历计数一遍查看是不是次数超过了一半。代码略去。
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; } };
当然还可以使用分治的方法,两半都找出一个最长的,然后判断是不是超过一半次数的。代码略去。
可以先排序。
还可以使用一种随机挑选数的方法,随便找一个数,然后遍历计数一遍查看是不是次数超过了一半。代码略去。
相关文章推荐
- 推荐大学生看的一些书
- 在Ubuntu 14.04 桌面上设置启动器(快捷方式)
- C++常用函数
- 菜鸟系列——pollard_rho分解质因子
- windows查看端口占用情况
- CURL POST请求上传图片
- java成长之路 JVM内存组成及分配
- html处理iframe中子页面与父页面里面对象的取得
- Python各进制间的转换
- hdu 1753 Java 高精度处理 大明A+B
- ajax遮盖
- Android动画效果animation
- TCP/IP协议学习(二) LWIP用户自定义配置文件解析
- [LeetCode] Longest Substring Without Repeating Characters
- PHP版3DES加解密类
- springboot 开发入门,及问题汇总
- UIAlertView的基本用法
- 数学D - Box of Bricks
- Thinkphp常用配置文件
- Codeforces 570A__Elections