[LintCode] Majority Number(以时间复杂度O(n)求主元素)
2015-07-28 20:46
351 查看
一个数据序列的主元素,是指序列中出现次数超过序列长度一半的元素。
法1(期望时间复杂度为O(n)):
由于主元素出现次数超过序列长度的一半,因此,主元素一定是中位数。可以利用递归划分求中位数的方法,期望时间复杂度为O(n)。
法2:
显然,如果一个序列存在主元素,那么我们去掉序列中不同的两个数,剩下序列的主元素和原序列的主元素相同。
具体算法操作:记录两个量,当前元素x,计数cnt。初始化cnt为0;然后遍历序列,若cnt为0,则将x设为当前元素并将cnt置为1,否则,若当前元素和x相同,那么cnt++,若当前元素和x不同,那么cnt--;遍历结束以后,x即为主元素。
代码实现如下:
法1(期望时间复杂度为O(n)):
由于主元素出现次数超过序列长度的一半,因此,主元素一定是中位数。可以利用递归划分求中位数的方法,期望时间复杂度为O(n)。
法2:
显然,如果一个序列存在主元素,那么我们去掉序列中不同的两个数,剩下序列的主元素和原序列的主元素相同。
具体算法操作:记录两个量,当前元素x,计数cnt。初始化cnt为0;然后遍历序列,若cnt为0,则将x设为当前元素并将cnt置为1,否则,若当前元素和x相同,那么cnt++,若当前元素和x不同,那么cnt--;遍历结束以后,x即为主元素。
代码实现如下:
class Solution { public: /** * @param nums: A list of integers * @return: The majority number */ int majorityNumber(vector<int> v) { // write your code here int x, cnt = 0; for(int i=0; i!=v.size(); ++i) { if(cnt==0) x = v[i], cnt = 1; else v[i]==x?++cnt:--cnt; } return x; } };
相关文章推荐
- python实现range函数
- PHP学习笔记1
- hdu 5308 I Wanna Become A 24-Point Master(构造)
- 数组的常用算法(1)--由“为了集齐108将买多少袋干脆面”展开去
- hdu 5301 Buildings
- [leetcode] Search a 2D Matrix II
- OC--迭代器/NSNumber/NSValue/NSRange/NSSet/NSDate 及相互转化
- poj 2431 Expedition 优先队列 大顶堆
- Java_Web三大框架之Hibernate 入门(一)
- 堆排序
- apk 反编译记录
- 10个超有用的网页设计工具和资源
- 使用命令行WScript和vbs创建快捷方式
- Netty版本升级血泪史之线程篇
- iOS操作小整理
- FragmentPager +ViewPager +FragmentStatePagerAdapter详解
- [MySQL]LeetCode196 Delete Duplicate Emails
- oracle connect by 说明
- Jquery IE下报错:缺少标识符、字符串或数字
- iOS学习之旅之C语言day4