LeetCode-Majority Element II
2015-08-06 11:03
423 查看
Given an integer array of size n,
find all elements that appear more than
The algorithm should run in linear time and in O(1) space.
此题是Majority Element的继续,关于此题可以移步至Majority
Element,关于Majority Element的解法挺多的,因为没有明确指明时间复杂度和空间复杂度,所以可以自由发挥,但是这个题就不那么随意了。可以看Majority
Element的最好一个解法,基于Boyer-Moore Algorithm。
先温习下上一题。此种算法的主要思想就是成组的出现,然后同时删除两个不相等的数,最后剩下的肯定是Majority Element。
比如Majority Element问题,可以分两种情况,Majority Element是否在此被消除的分组中
1)如果让Majority Element和其他非此元素成对的删除,显然最后剩下的就是Majority Element,因为这个元素是多数的。这显然是最坏的情况
2)如果两个非Majority Element元素成对被删除,那剩下的Majority Element数量会更多。
而以上两种中,如果被假定的元素的counter为0,说明此元素是被消除者,非Majority Element,所以要交换假定的Majority Element。
----------------------------------------------------------------------------------------------------------------
再来搞这一题,通过分析此题可以得知,满足这个条件的元素最多为两个,所以这次就可以以三个为一组:
1)当前元素与假定Majority Element相等时,计数器加1。
2)当当前元素的计数器为0是,说明是被消除者,交换假定的Majority Element。
3)如果与假定的Majority Element不相等时,同时消除一组,此时为3个元素,即消除两个假定的Majority Element,两个计数器同时减1。
4)最后不要忘记判断得出来的元素是否为Majority Element
根据以上分析,可以得出如下代码:
这种题可以提升到满足⌊ n/k ⌋
find all elements that appear more than
⌊ n/3 ⌋times.
The algorithm should run in linear time and in O(1) space.
此题是Majority Element的继续,关于此题可以移步至Majority
Element,关于Majority Element的解法挺多的,因为没有明确指明时间复杂度和空间复杂度,所以可以自由发挥,但是这个题就不那么随意了。可以看Majority
Element的最好一个解法,基于Boyer-Moore Algorithm。
先温习下上一题。此种算法的主要思想就是成组的出现,然后同时删除两个不相等的数,最后剩下的肯定是Majority Element。
比如Majority Element问题,可以分两种情况,Majority Element是否在此被消除的分组中
1)如果让Majority Element和其他非此元素成对的删除,显然最后剩下的就是Majority Element,因为这个元素是多数的。这显然是最坏的情况
2)如果两个非Majority Element元素成对被删除,那剩下的Majority Element数量会更多。
而以上两种中,如果被假定的元素的counter为0,说明此元素是被消除者,非Majority Element,所以要交换假定的Majority Element。
----------------------------------------------------------------------------------------------------------------
再来搞这一题,通过分析此题可以得知,满足这个条件的元素最多为两个,所以这次就可以以三个为一组:
1)当前元素与假定Majority Element相等时,计数器加1。
2)当当前元素的计数器为0是,说明是被消除者,交换假定的Majority Element。
3)如果与假定的Majority Element不相等时,同时消除一组,此时为3个元素,即消除两个假定的Majority Element,两个计数器同时减1。
4)最后不要忘记判断得出来的元素是否为Majority Element
根据以上分析,可以得出如下代码:
public List<Integer> majorityElement(int[] nums) { List<Integer> ret = new ArrayList<Integer>(); if (nums == null || nums.length == 0) return ret; int num1 = 0, num2 = 0, cnt1 = 0, cnt2 = 0; for (int i = 0; i < nums.length; i++) { if (num1 == nums[i]) cnt1++; else if (num2 == nums[i]) cnt2++; else if (cnt1 == 0) { cnt1++; num1 = nums[i]; } else if (cnt2 == 0) { cnt2++; num2 = nums[i]; } else { cnt1--; cnt2--; } } cnt1 = 0; cnt2 = 0; for (int i = 0; i < nums.length; i++) { if (num1 == nums[i]) cnt1++; else if (num2 == nums[i]) cnt2++; } if (cnt1 > nums.length/3) ret.add(num1); if (cnt2 > nums.length/3) ret.add(num2); return ret; }
这种题可以提升到满足⌊ n/k ⌋
相关文章推荐
- Java菜鸟程序员学习计划
- OSG从高程图创建地形-可运行
- hdu 1548 A strange lift
- poj3216Repairing Company 二分匹配之最小路径覆盖+floyd
- C(2)
- 怎么样高效的学习机器学习?
- Linux下Apache源码安装经验
- php学习笔记0001 变量作用域
- (转)Android自定义View的实现方法,带你一步步深入了解View(四)
- POJ 1979:Red and Black
- 当查询主键返回特定行的时候,用like还是等号
- js闭包类似cs闭包
- Android Studio xml提示Line 1: PI must not start with xml (position:unknown @1:5) (Show)
- Regionals 2014 Asia - Bangkok
- poj3281 Dining(最大流)
- 18. Element firstChild 属性
- openwrt挂载U盘
- 南邮 OJ 1703 Yushi难题
- 实战:Brocade交换机升级OS
- 估算项目的时间进度