※ Leetcode - Array - 169. Majority Element(快速找出数组中出现过一半以上次数的数,3种写法)
来源:互联网 发布:warframe 知乎 编辑:程序博客网 时间:2024/06/05 07:33
1.7.1 Problem Description
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次以上(不含n/2)的数字。
2. My solution1:Hash count(O[n])
计算每个数出现的次数直接输出出现次数最多的数。
int majorityElement(vector<int>& nums) { map<int,int>hh; int len=nums.size(); int ansindex=0; for(int i=0;i<len;i++) { hh[nums[i]]++; if(hh[nums[i]]>hh[nums[ansindex]]) ansindex=i; } return nums[ansindex]; }
3.My solution2 排序输出中间数(O[nlogn])
偷懒的做法,因为已经表示出现次数多于一半,直接排序后输出中间的那个数(偶数奇数都是n/2位置)即可。
int majorityElement(vector<int>& nums) { int len=nums.size(); sort(nums.begin(),nums.end()); return nums[len/2]; }
4. Brilliant Algorithm(O[n])
这种做法只有majority number存在的时候才可以使用,Brilliant Algorithm!
每找出两个不同的element,则成对删除。最终剩下的一定就是所求的。
算法思路来自陆草纯的博客,这里把他在leetcode上的证明简单阐述一下。
扩展到[n/k]的情况:将每k个不同的element进行成组删除,剩下的就是所求的数字。
证明:
假设我们将这n个数每k个数编组(保证每个组内的k个数互不相同),这样可以有n/k个组,每个组只有一个Majority Number。
由于这个数出现了超过n/k次,假设是n/k+1次。
那么当我们计算到第n/k-1个组时,由于“每个组只有一个Majority Number”,这里我们已经计算了(n/k-1)*k个数,而Majority Number出现了n/k-1次。
那么剩下的k个数中,必然存在至少两个Majority Number。
在下文中的code中,我们最终保留的(Answer)实际是在最后一个组中重复出现的数字。自然也就是Majority Number。
class Solution { int majorityElement(int[] num) { int major=num[0], count = 1; for(int i=1; i<num.length;i++){ if(count==0){ count++; major=num[i]; }else if(major==num[i]){ count++; }else count--; } return major; }}
- ※ Leetcode - Array - 169. Majority Element(快速找出数组中出现过一半以上次数的数,3种写法)
- 169.Majority Element (数组中出现次数超过一半的数)
- leetcode169---Majority Element(数组中出现次数超过一半的数)
- 找出数组中出现一半以上次数的数字
- 169. Majority Element--寻找数组中出现次数超过一半的数据,229. Majority Element II--注意最后的检测
- 数组之找出Array中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 算法--找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 算法--找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 算法--找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 写给想当程序员的朋友
- INSERT ... ON DUPLICATE KEY UPDATE
- Hive中小表与大表关联(join)的性能分析
- 友盟分享Title设置
- 确定比赛名次 hd 1285
- ※ Leetcode - Array - 169. Majority Element(快速找出数组中出现过一半以上次数的数,3种写法)
- Runtime系列(Method Swizzling)
- H5学习之23 CSS 水平对齐(定位,调整位置)
- STL中set容器的一点总结
- iOS判断是否插入耳机
- 跳转到AppStore中应用页面
- ViewPager圆点导航动态实现(利用seletor)
- 极光推送JPush相关设置
- PTAM学习笔记(一)---PTAM在windows上的编译